@tailor-platform/sdk 1.58.0 → 1.59.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.
Files changed (77) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/dist/{application-B59TaTk_.mjs → application-FnWOxBk7.mjs} +46 -27
  3. package/dist/application-FnWOxBk7.mjs.map +1 -0
  4. package/dist/application-VOdgMtOD.mjs +4 -0
  5. package/dist/{authconnection-TsdLYaLs.d.mts → authconnection-BIYzEh2p.d.mts} +2 -2
  6. package/dist/authconnection-D8SJGMpj.mjs.map +1 -1
  7. package/dist/cli/erd-viewer-assets/app.js +4 -4
  8. package/dist/cli/index.mjs +13 -12
  9. package/dist/cli/index.mjs.map +1 -1
  10. package/dist/cli/lib.mjs +4 -3
  11. package/dist/cli/lib.mjs.map +1 -1
  12. package/dist/client-B-jRdlC_.mjs +4 -0
  13. package/dist/{client-62B-r3MN.mjs → client-W5P4NYYX.mjs} +117 -4
  14. package/dist/{client-62B-r3MN.mjs.map → client-W5P4NYYX.mjs.map} +1 -1
  15. package/dist/configure/index.d.mts +1 -1
  16. package/dist/configure/index.mjs +8 -8
  17. package/dist/configure/index.mjs.map +1 -1
  18. package/dist/{crashreport-CCGpLUlP.mjs → crashreport-D3DvAzdg.mjs} +3 -3
  19. package/dist/crashreport-D3DvAzdg.mjs.map +1 -0
  20. package/dist/{crashreport-CXD_Kjk-.mjs → crashreport-lnVTnbB5.mjs} +1 -1
  21. package/dist/file-B58Dm-2P.mjs.map +1 -1
  22. package/dist/{file-VTJbbOL3.d.mts → file-BzK8z3X-.d.mts} +2 -2
  23. package/dist/globals-ByrCoDip.mjs +109 -0
  24. package/dist/globals-ByrCoDip.mjs.map +1 -0
  25. package/dist/iconv-DreIffeM.mjs.map +1 -1
  26. package/dist/{iconv-Chu6Hit2.d.mts → iconv-kwrmd1U_.d.mts} +2 -2
  27. package/dist/{idp-Di9N4FSJ.d.mts → idp-BlBPtXJ-.d.mts} +2 -2
  28. package/dist/idp-Ch95ag8h.mjs.map +1 -1
  29. package/dist/{index-BWoHfE-i.d.mts → index-Cr6ufjZ5.d.mts} +10 -8
  30. package/dist/{index-DTSQthwF.d.mts → index-DRhMpdnA.d.mts} +7 -7
  31. package/dist/{job-CEAJLiGp.mjs → job-BpsFXPbi.mjs} +8 -17
  32. package/dist/job-BpsFXPbi.mjs.map +1 -0
  33. package/dist/mock-Dpu__UeJ.mjs +805 -0
  34. package/dist/mock-Dpu__UeJ.mjs.map +1 -0
  35. package/dist/registry-D0uB0OrK.mjs +178 -0
  36. package/dist/registry-D0uB0OrK.mjs.map +1 -0
  37. package/dist/{repl-editor-ihh8koiR.mjs → repl-editor-Y9QJDL0K.mjs} +3 -9
  38. package/dist/{repl-editor-ihh8koiR.mjs.map → repl-editor-Y9QJDL0K.mjs.map} +1 -1
  39. package/dist/runtime/authconnection.d.mts +1 -1
  40. package/dist/runtime/file.d.mts +1 -1
  41. package/dist/runtime/globals.d.mts +5 -5
  42. package/dist/runtime/iconv.d.mts +1 -1
  43. package/dist/runtime/idp.d.mts +1 -1
  44. package/dist/runtime/index.d.mts +7 -7
  45. package/dist/runtime/secretmanager.d.mts +1 -1
  46. package/dist/runtime/workflow.d.mts +1 -1
  47. package/dist/{runtime-BC-FbQkg.mjs → runtime-CrUa8Z2k.mjs} +238 -273
  48. package/dist/runtime-CrUa8Z2k.mjs.map +1 -0
  49. package/dist/secretmanager-B9h-U_8U.mjs.map +1 -1
  50. package/dist/{secretmanager-BhpDmxwT.d.mts → secretmanager-CKLB3wAQ.d.mts} +2 -2
  51. package/dist/utils/test/index.d.mts +5 -5
  52. package/dist/utils/test/index.mjs +7 -7
  53. package/dist/utils/test/index.mjs.map +1 -1
  54. package/dist/vitest/environment.mjs +3 -4
  55. package/dist/vitest/environment.mjs.map +1 -1
  56. package/dist/vitest/index.d.mts +167 -120
  57. package/dist/vitest/index.mjs +6 -6
  58. package/dist/vitest/index.mjs.map +1 -1
  59. package/dist/vitest/setup.d.mts +1 -1
  60. package/dist/vitest/setup.mjs +4 -3
  61. package/dist/vitest/setup.mjs.map +1 -1
  62. package/dist/workflow--aPbA8Uq.mjs.map +1 -1
  63. package/dist/{workflow-dYYH7QFa.d.mts → workflow-CMamswkK.d.mts} +2 -2
  64. package/docs/configuration.md +1 -1
  65. package/docs/runtime.md +9 -12
  66. package/docs/testing.md +92 -85
  67. package/package.json +5 -5
  68. package/dist/application-B59TaTk_.mjs.map +0 -1
  69. package/dist/application-gO_pa5BO.mjs +0 -4
  70. package/dist/client-BWl3f1XS.mjs +0 -4
  71. package/dist/crashreport-CCGpLUlP.mjs.map +0 -1
  72. package/dist/job-CEAJLiGp.mjs.map +0 -1
  73. package/dist/mock-B6PI49C_.mjs +0 -844
  74. package/dist/mock-B6PI49C_.mjs.map +0 -1
  75. package/dist/runtime-BC-FbQkg.mjs.map +0 -1
  76. package/dist/test-env-key-CSnK4W1Y.mjs +0 -30
  77. package/dist/test-env-key-CSnK4W1Y.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["randomState","listCommand","fs","fs","listCommand","deployCommand","listCommand","getCommand","fs","getCommand","listCommand","detectPackageManager","listCommand","listCommand","getCommand","createCommand","deleteCommand","getCommand","listCommand","updateCommand","getCommand","listCommand","updateCommand","createCommand","deleteCommand","listCommand","updateCommand","createCommand","deleteCommand","listCommand","updateCommand","createCommand","deleteCommand","listCommand","createCommand","deleteCommand","listCommand","setupPnpm","setupYarn","setupNpm","setupBun","fs","deployTemplate","fs","setTimeout","mimeLookup","listCommand","listCommand","fs","DEFAULT_ERD_BASE_DIR","fs","lookupMime","fs","fs","generateCommand","listCommand","userCommand","listCommand","listCommand","getCommand","listCommand","listCommand","updateCommand","createCommand","deleteCommand","getCommand","listCommand","deployCommand","removeCommand","userCommand"],"sources":["../../src/cli/commands/authconnection/args.ts","../../src/cli/commands/authconnection/authorize.ts","../../src/cli/commands/authconnection/delete.ts","../../src/cli/commands/authconnection/list.ts","../../src/cli/commands/authconnection/revoke.ts","../../src/cli/commands/authconnection/index.ts","../../src/cli/commands/crashreport/list.ts","../../src/cli/commands/crashreport/send.ts","../../src/cli/commands/crashreport/index.ts","../../src/cli/commands/deploy/index.ts","../../src/cli/commands/executor/index.ts","../../src/cli/shared/function-script-download.ts","../../src/cli/shared/stack-trace.ts","../../src/cli/commands/function/logs.ts","../../src/cli/commands/function/bundle.ts","../../src/cli/commands/function/detect.ts","../../src/cli/commands/function/test-run.ts","../../src/cli/commands/function/index.ts","../../src/cli/commands/generate/index.ts","../../src/cli/commands/init.ts","../../src/cli/commands/login.ts","../../src/cli/commands/logout.ts","../../src/cli/commands/machineuser/index.ts","../../src/cli/commands/oauth2client/index.ts","../../src/cli/commands/open.ts","../../src/cli/commands/organization/folder/index.ts","../../src/cli/commands/organization/index.ts","../../src/cli/commands/profile/create.ts","../../src/cli/commands/profile/delete.ts","../../src/cli/commands/profile/list.ts","../../src/cli/commands/profile/update.ts","../../src/cli/commands/profile/index.ts","../../src/cli/commands/secret/args.ts","../../src/cli/commands/secret/check-vault-managed.ts","../../src/cli/commands/secret/create.ts","../../src/cli/commands/secret/delete.ts","../../src/cli/commands/secret/list.ts","../../src/cli/commands/secret/update.ts","../../src/cli/commands/secret/vault/args.ts","../../src/cli/commands/secret/vault/create.ts","../../src/cli/commands/secret/vault/delete.ts","../../src/cli/commands/secret/vault/list.ts","../../src/cli/commands/secret/vault/index.ts","../../src/cli/commands/secret/index.ts","../../src/cli/commands/setup/github/deploy.workflow.yml","../../src/cli/commands/setup/github/setup-bun.yml","../../src/cli/commands/setup/github/setup-npm.yml","../../src/cli/commands/setup/github/setup-pnpm.yml","../../src/cli/commands/setup/github/setup-yarn.yml","../../src/cli/commands/setup/github/template-deploy.ts","../../src/cli/commands/setup/github/github.ts","../../src/cli/commands/setup/github/index.ts","../../src/cli/commands/setup/index.ts","../../src/cli/shared/skills-installer.ts","../../src/cli/commands/skills/install.ts","../../src/cli/commands/skills/index.ts","../../src/cli/shared/progress.ts","../../src/cli/commands/staticwebsite/deploy.ts","../../src/cli/commands/staticwebsite/domain/status.ts","../../src/cli/commands/staticwebsite/domain/get.ts","../../src/cli/commands/staticwebsite/domain/list.ts","../../src/cli/commands/staticwebsite/domain/index.ts","../../src/cli/commands/staticwebsite/get.ts","../../src/cli/commands/staticwebsite/list.ts","../../src/cli/commands/staticwebsite/index.ts","../../src/cli/commands/tailordb/erd/local-schema.ts","../../src/cli/commands/tailordb/erd/schema.ts","../../src/cli/commands/tailordb/erd/utils.ts","../../src/cli/commands/tailordb/erd/viewer.ts","../../src/cli/commands/tailordb/erd/export.ts","../../src/cli/commands/tailordb/erd/deploy.ts","../../src/cli/commands/tailordb/erd/serve.ts","../../src/cli/commands/tailordb/erd/index.ts","../../src/cli/commands/tailordb/migrate/script.ts","../../src/cli/commands/tailordb/migrate/set.ts","../../src/cli/commands/tailordb/migrate/status.ts","../../src/cli/commands/tailordb/migrate/index.ts","../../src/cli/commands/tailordb/index.ts","../../src/cli/commands/upgrade/index.ts","../../src/cli/commands/user/current.ts","../../src/cli/commands/user/list.ts","../../src/cli/commands/user/pat/transform.ts","../../src/cli/commands/user/pat/create.ts","../../src/cli/commands/user/pat/delete.ts","../../src/cli/commands/user/pat/list.ts","../../src/cli/commands/user/pat/update.ts","../../src/cli/commands/user/pat/index.ts","../../src/cli/commands/user/switch.ts","../../src/cli/commands/user/index.ts","../../src/cli/commands/workflow/index.ts","../../src/cli/commands/workspace/app/index.ts","../../src/cli/commands/workspace/user/index.ts","../../src/cli/commands/workspace/index.ts","../../src/cli/index.ts"],"sourcesContent":["import { arg } from \"politty\";\nimport { z } from \"zod\";\n\n/**\n * Arguments for identifying an auth connection\n */\nexport const connectionNameArgs = {\n name: arg(z.string(), {\n alias: \"n\",\n description: \"Auth connection name\",\n }),\n};\n","import * as crypto from \"node:crypto\";\nimport * as http from \"node:http\";\nimport open from \"open\";\nimport { z } from \"zod\";\nimport { workspaceArgs } from \"@/cli/shared/args\";\nimport { fetchAll, initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport { connectionNameArgs } from \"./args\";\n\nconst defaultPort = 8080;\nconst defaultScopes = \"openid,profile,email\";\n\n/**\n * Fetch the OpenID Connect discovery document from a provider URL.\n * @param providerUrl - OAuth2 provider base URL\n * @returns Discovery document with authorization_endpoint\n */\nasync function fetchOIDCDiscovery(\n providerUrl: string,\n): Promise<{ authorization_endpoint: string }> {\n const url = providerUrl.replace(/\\/$/, \"\") + \"/.well-known/openid-configuration\";\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch OIDC discovery from ${url}: ${response.status}`);\n }\n return response.json() as Promise<{\n authorization_endpoint: string;\n }>;\n}\n\nfunction randomState() {\n return crypto.randomBytes(32).toString(\"base64url\");\n}\n\nexport const authorizeAuthConnectionCommand = defineAppCommand({\n name: \"authorize\",\n description: \"Authorize an auth connection via OAuth2 flow.\",\n args: z\n .object({\n ...workspaceArgs,\n ...connectionNameArgs,\n scopes: z\n .string()\n .optional()\n .default(defaultScopes)\n .describe(\"OAuth2 scopes to request (comma-separated)\"),\n port: z.coerce\n .number()\n .optional()\n .default(defaultPort)\n .describe(\"Local callback server port\"),\n \"no-browser\": z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Don't open browser automatically\"),\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n // Find the connection to get its provider URL and client ID\n const connections = await fetchAll(async (pageToken, maxPageSize) => {\n const { connections, nextPageToken } = await client.listAuthConnections({\n workspaceId,\n pageToken,\n pageSize: maxPageSize,\n });\n return [connections, nextPageToken];\n });\n\n const connection = connections.find((c) => c.name === args.name);\n if (!connection) {\n throw new Error(`Auth connection \"${args.name}\" not found.`);\n }\n\n if (connection.config.case !== \"oauth2\") {\n throw new Error(`Auth connection \"${args.name}\" is not an OAuth2 connection.`);\n }\n\n const oauth2Config = connection.config.value;\n const redirectUri = `http://localhost:${args.port}/callback`;\n const state = randomState();\n\n // Resolve authorization endpoint from discovery or explicit config\n let authorizationEndpoint: string;\n if (oauth2Config.authUrl) {\n authorizationEndpoint = oauth2Config.authUrl;\n } else {\n const discovery = await fetchOIDCDiscovery(oauth2Config.providerUrl);\n authorizationEndpoint = discovery.authorization_endpoint;\n }\n\n // Build authorization URL\n const authUrl = new URL(authorizationEndpoint);\n authUrl.searchParams.set(\"client_id\", oauth2Config.clientId);\n authUrl.searchParams.set(\"redirect_uri\", redirectUri);\n authUrl.searchParams.set(\"response_type\", \"code\");\n authUrl.searchParams.set(\"scope\", args.scopes.replace(/,/g, \" \"));\n authUrl.searchParams.set(\"state\", state);\n authUrl.searchParams.set(\"access_type\", \"offline\");\n\n await new Promise<void>((resolve, reject) => {\n const server = http.createServer(async (req, res) => {\n if (!req.url?.startsWith(\"/callback\")) {\n res.writeHead(404);\n res.end(\"Not found\");\n return;\n }\n\n try {\n const url = new URL(req.url, `http://localhost:${args.port}`);\n const code = url.searchParams.get(\"code\");\n const returnedState = url.searchParams.get(\"state\");\n const error = url.searchParams.get(\"error\");\n\n if (error) {\n throw new Error(`Authorization failed: ${error}`);\n }\n\n if (returnedState !== state) {\n throw new Error(\"State mismatch — possible CSRF attack.\");\n }\n\n if (!code) {\n throw new Error(\"No authorization code received.\");\n }\n\n // Send authorization code to the platform for server-side token exchange\n await client.exchangeAuthConnectionAuthorizationCode({\n workspaceId,\n connectionName: args.name,\n authorizationCode: code,\n redirectUri,\n });\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><h1>Authorization successful</h1><p>You can close this window.</p></body></html>\",\n );\n server.close();\n resolve();\n } catch (err) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(`Authorization failed: ${err instanceof Error ? err.message : \"Unknown error\"}`);\n server.close();\n reject(err);\n }\n });\n\n const timeout = setTimeout(\n () => {\n server.close();\n reject(new Error(\"Authorization timeout exceeded (5 minutes).\"));\n },\n 5 * 60 * 1000,\n );\n\n server.on(\"close\", () => {\n clearTimeout(timeout);\n });\n\n server.on(\"error\", (err) => {\n reject(err);\n });\n\n server.listen(args.port, async () => {\n const authorizeUrl = authUrl.toString();\n logger.info(`Opening browser for authorization:\\n\\n${authorizeUrl}\\n`);\n if (!args[\"no-browser\"]) {\n try {\n await open(authorizeUrl);\n } catch {\n logger.warn(\n \"Failed to open browser automatically. Please open the URL above manually.\",\n );\n }\n }\n });\n });\n\n logger.success(`Auth connection \"${args.name}\" authorized successfully.`);\n },\n});\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { z } from \"zod\";\nimport { confirmationArgs, workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { prompt } from \"@/cli/shared/prompt\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport { connectionNameArgs } from \"./args\";\n\nexport const deleteAuthConnectionCommand = defineAppCommand({\n name: \"delete\",\n description: \"Delete an auth connection entirely.\",\n args: z\n .object({\n ...workspaceArgs,\n ...connectionNameArgs,\n ...confirmationArgs,\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n if (!args.yes) {\n const confirmation = await prompt.text({\n message: `Enter the connection name to confirm deletion (\"${args.name}\"):`,\n });\n\n if (confirmation !== args.name) {\n logger.info(\"Auth connection deletion cancelled.\");\n return;\n }\n }\n\n try {\n await client.deleteAuthConnection({ workspaceId, connectionName: args.name });\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(`Auth connection \"${args.name}\" not found.`, { cause: error });\n }\n throw error;\n }\n\n logger.success(`Auth connection \"${args.name}\" deleted.`);\n },\n});\n","import { timestampDate } from \"@bufbuild/protobuf/wkt\";\nimport { Code, ConnectError } from \"@connectrpc/connect\";\nimport { z } from \"zod\";\nimport { paginationArgs, toPageDirection, workspaceArgs } from \"@/cli/shared/args\";\nimport { fetchPaged, initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport type { AuthConnection } from \"@tailor-proto/tailor/v1/auth_resource_pb\";\n\ninterface ConnectionInfo {\n name: string;\n type: string;\n providerUrl: string;\n issuerUrl: string;\n clientId: string;\n authUrl: string;\n tokenUrl: string;\n createdAt: Date | null;\n}\n\nfunction connectionInfo(connection: AuthConnection): ConnectionInfo {\n const oauth2 = connection.config.case === \"oauth2\" ? connection.config.value : undefined;\n return {\n name: connection.name,\n type: connection.config.case ?? \"unknown\",\n providerUrl: oauth2?.providerUrl ?? \"\",\n issuerUrl: oauth2?.issuerUrl ?? \"\",\n clientId: oauth2?.clientId ?? \"\",\n authUrl: oauth2?.authUrl ?? \"\",\n tokenUrl: oauth2?.tokenUrl ?? \"\",\n createdAt: connection.createdAt ? timestampDate(connection.createdAt) : null,\n };\n}\n\nexport const listAuthConnectionCommand = defineAppCommand({\n name: \"list\",\n description: \"List all auth connections.\",\n args: z.object({ ...workspaceArgs, ...paginationArgs() }).strict(),\n run: async (args) => {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n try {\n const pageDirection = toPageDirection(args.order);\n const connections = await fetchPaged(\n async (pageToken, pageSize) => {\n const { connections, nextPageToken } = await client.listAuthConnections({\n workspaceId,\n pageToken,\n pageSize,\n pageDirection,\n });\n return [connections, nextPageToken];\n },\n { limit: args.limit },\n );\n logger.out(connections.map(connectionInfo));\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n logger.out([]);\n return;\n }\n throw error;\n }\n },\n});\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { z } from \"zod\";\nimport { confirmationArgs, workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { prompt } from \"@/cli/shared/prompt\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport { connectionNameArgs } from \"./args\";\n\nexport const revokeAuthConnectionCommand = defineAppCommand({\n name: \"revoke\",\n description:\n \"Revoke an auth connection's tokens (keeps the connection; use 'delete' to remove it).\",\n notes:\n \"Revoke invalidates the connection's active session and tokens but keeps the connection and its stored credentials, so it can be re-authorized later. Use `delete` to remove the connection entirely.\",\n args: z\n .object({\n ...workspaceArgs,\n ...connectionNameArgs,\n ...confirmationArgs,\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n if (!args.yes) {\n const confirmation = await prompt.text({\n message: `Enter the connection name to confirm revocation (\"${args.name}\"):`,\n });\n\n if (confirmation !== args.name) {\n logger.info(\"Auth connection revocation cancelled.\");\n return;\n }\n }\n\n try {\n await client.revokeAuthConnection({\n workspaceId,\n connectionName: args.name,\n });\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(`Auth connection \"${args.name}\" not found.`, { cause: error });\n }\n throw error;\n }\n\n logger.success(`Auth connection \"${args.name}\" revoked.`);\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { authorizeAuthConnectionCommand } from \"./authorize\";\nimport { deleteAuthConnectionCommand } from \"./delete\";\nimport { listAuthConnectionCommand } from \"./list\";\nimport { revokeAuthConnectionCommand } from \"./revoke\";\n\nexport const authconnectionCommand = defineCommand({\n name: \"authconnection\",\n description: \"Manage auth connections.\",\n subCommands: {\n authorize: authorizeAuthConnectionCommand,\n list: listAuthConnectionCommand,\n revoke: revokeAuthConnectionCommand,\n delete: deleteAuthConnectionCommand,\n },\n async run() {\n await runCommand(listAuthConnectionCommand, []);\n },\n});\n","import * as fs from \"node:fs\";\nimport * as path from \"pathe\";\nimport { z } from \"zod\";\nimport { parseCrashReportConfig } from \"@/cli/crashreport/config\";\nimport { CRASH_LOG_EXTENSION } from \"@/cli/crashreport/writer\";\nimport { type Order, paginationArgs } from \"@/cli/shared/args\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { logger } from \"@/cli/shared/logger\";\n\nexport function orderAndLimitCrashReports(\n entries: string[],\n options: { order?: Order; limit?: number },\n): string[] {\n const sorted = entries.filter((f) => f.endsWith(CRASH_LOG_EXTENSION)).sort();\n const ordered = options.order === \"asc\" ? sorted : sorted.reverse();\n return options.limit && options.limit > 0 ? ordered.slice(0, options.limit) : ordered;\n}\n\nfunction formatCrashReportFiles(files: string[], localDir: string) {\n return files.map((file) => ({\n file,\n path: path.join(localDir, file),\n }));\n}\n\nexport const listCommand = defineAppCommand({\n name: \"list\",\n description: \"List local crash report files.\",\n args: z\n .object({\n ...paginationArgs(),\n })\n .strict(),\n run: async (args) => {\n const config = parseCrashReportConfig();\n const jsonOutput = logger.jsonMode;\n if (!config.localDir) {\n logger.info(\"Crash report directory not available.\");\n if (jsonOutput) {\n logger.out([]);\n }\n return;\n }\n\n let entries: string[];\n try {\n entries = fs.readdirSync(config.localDir);\n } catch {\n logger.info(\"No crash reports found.\");\n if (jsonOutput) {\n logger.out([]);\n }\n return;\n }\n\n const files = orderAndLimitCrashReports(entries, { order: args.order, limit: args.limit });\n\n if (files.length === 0) {\n logger.info(\"No crash reports found.\");\n if (jsonOutput) {\n logger.out([]);\n }\n return;\n }\n\n if (jsonOutput) {\n logger.out(formatCrashReportFiles(files, config.localDir));\n return;\n }\n\n logger.info(`${files.length} crash report(s) in ${config.localDir}:`);\n for (const file of files) {\n logger.log(` ${file}`);\n }\n },\n});\n","import * as fs from \"node:fs\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { sendCrashReport } from \"@/cli/crashreport/sender\";\nimport { JSON_FOOTER_MARKER } from \"@/cli/crashreport/writer\";\nimport { userAgent } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { logger } from \"@/cli/shared/logger\";\nimport type { CrashReport } from \"@/cli/crashreport/report\";\n\nexport const sendCommand = defineAppCommand({\n name: \"send\",\n description: \"Submit a crash report to help improve the SDK.\",\n args: z\n .object({\n file: arg(z.string(), {\n description: \"Path to the crash report file\",\n required: true,\n completion: { type: \"file\", extensions: [\"log\"] },\n }),\n })\n .strict(),\n run: async (args) => {\n let content: string;\n try {\n content = fs.readFileSync(args.file, \"utf-8\");\n } catch {\n logger.error(`Crash report file not found: ${args.file}`);\n process.exit(1);\n }\n\n const report = parseCrashLogFile(content);\n if (!report) {\n logger.error(\"Failed to parse crash report file. The file may be corrupted.\");\n process.exit(1);\n }\n\n const ua = await userAgent();\n logger.info(\"Sending crash report...\");\n const success = await sendCrashReport(report, ua);\n\n if (success) {\n logger.success(\"Crash report submitted successfully. Thank you!\");\n } else {\n logger.error(\"Failed to submit crash report. The server may be unavailable.\");\n process.exit(1);\n }\n },\n});\n\n/**\n * Parse a crash log file back into a CrashReport object.\n * Reads the embedded JSON footer appended by formatCrashReport.\n * @param content - File content\n * @returns Parsed report or undefined if parsing fails\n */\nexport function parseCrashLogFile(content: string): CrashReport | undefined {\n try {\n const normalized = content.replace(/\\r\\n/g, \"\\n\");\n const marker = `\\n${JSON_FOOTER_MARKER}\\n`;\n const lastIdx = normalized.lastIndexOf(marker);\n if (lastIdx === -1) return undefined;\n const jsonLine = normalized.slice(lastIdx + marker.length).split(\"\\n\")[0];\n if (!jsonLine) return undefined;\n return JSON.parse(jsonLine) as CrashReport;\n } catch {\n return undefined;\n }\n}\n","import { defineCommand, runCommand } from \"politty\";\nimport { listCommand } from \"./list\";\nimport { sendCommand } from \"./send\";\n\nexport const crashReportCommand = defineCommand({\n name: \"crashreport\",\n aliases: [\"crash-report\"],\n description: \"Manage crash reports.\",\n subCommands: {\n list: listCommand,\n send: sendCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { deploy } from \"@/cli/commands/deploy/deploy\";\nimport { confirmationArgs, deploymentArgs } from \"@/cli/shared/args\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\n\nexport const deployCommand = defineAppCommand({\n name: \"deploy\",\n aliases: [\"apply\"],\n description: \"Deploy your application by applying the Tailor configuration.\",\n args: z\n .object({\n ...deploymentArgs,\n ...confirmationArgs,\n \"dry-run\": arg(z.boolean().optional(), {\n alias: \"d\",\n description: \"Run the command without making any changes\",\n }),\n \"no-schema-check\": arg(z.boolean().optional(), {\n description: \"Skip schema diff check against migration snapshots\",\n }),\n \"no-cache\": arg(z.boolean().optional(), {\n description: \"Disable bundle caching for this run\",\n }),\n \"clean-cache\": arg(z.boolean().optional(), {\n description: \"Clean the bundle cache before building\",\n }),\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n const { initTelemetry } = await import(\"@/cli/telemetry\");\n await initTelemetry();\n await deploy({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n configPath: args.config,\n dryRun: args[\"dry-run\"],\n yes: args.yes,\n noSchemaCheck: args[\"no-schema-check\"],\n noCache: args[\"no-cache\"],\n cleanCache: args[\"clean-cache\"],\n });\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { getCommand } from \"./get\";\nimport { jobsCommand } from \"./jobs\";\nimport { listCommand } from \"./list\";\nimport { triggerCommand } from \"./trigger\";\nimport { webhookCommand } from \"./webhook\";\n\nexport const executorCommand = defineCommand({\n name: \"executor\",\n description: \"Manage executors\",\n subCommands: {\n trigger: triggerCommand,\n jobs: jobsCommand,\n list: listCommand,\n get: getCommand,\n webhook: webhookCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","/**\n * Download a deployed function script from the function registry.\n *\n * Wraps the server-streaming `downloadFunctionRegistryScript` RPC and\n * concatenates content chunks into a single UTF-8 string.\n */\n\nimport { timestampDate } from \"@bufbuild/protobuf/wkt\";\nimport { FunctionExecution_Type } from \"@tailor-proto/tailor/v1/function_resource_pb\";\nimport { logger } from \"@/cli/shared/logger\";\nimport type { OperatorClient } from \"@/cli/shared/client\";\n\n/**\n * Translate a `FunctionExecution.scriptName` into the corresponding\n * function registry name used by `downloadFunctionRegistryScript`.\n *\n * The platform records executions under a script-name format that\n * differs from the registry name. The execution `type` is used as the\n * primary discriminator because workflow job names are unconstrained\n * strings (`WorkflowJobSchema.name: z.string()`) and may contain dots\n * that collide with the resolver / executor / hook filename suffixes.\n *\n * JOB: `<jobName>` -> `workflow--<jobName>`\n * STANDARD resolver: `<namespace>.<name>.body.js` -> `resolver--<namespace>--<name>`\n * STANDARD executor: `<name>.operation.js` -> `executor--<name>`\n * STANDARD auth hook: `<authName>.<hookPoint>.hook.js` -> `auth-hook--<authName>--<hookPoint>`\n *\n * For older servers that leave `type` as `UNSPECIFIED`, the same\n * filename-suffix heuristic is applied, with a bare-name fallback to\n * `workflow--<name>` for backward compatibility. Returns `null` for\n * unrecognized formats (ad-hoc test-run scripts, seed scripts, etc.\n * that are not stored in the registry).\n * @param scriptName - The `scriptName` field from a `FunctionExecution`\n * @param executionType - The `type` field from a `FunctionExecution`\n * @returns The function registry name, or null when no mapping applies\n */\nexport function scriptNameToRegistryName(\n scriptName: string,\n executionType: FunctionExecution_Type,\n): string | null {\n // JOB: scriptName IS the workflow job name. Job names are\n // unconstrained, so dots must be preserved.\n if (executionType === FunctionExecution_Type.JOB) {\n return `workflow--${scriptName}`;\n }\n\n // Resolver: `<namespace>.<name>.body.js`\n // Use a non-greedy match for namespace so a name containing dots is\n // grouped into `name`, mirroring how resolvers are registered.\n const resolverMatch = /^([^.]+)\\.(.+)\\.body\\.js$/.exec(scriptName);\n if (resolverMatch) {\n const [, namespace, name] = resolverMatch;\n return `resolver--${namespace}--${name}`;\n }\n\n // Executor: `<name>.operation.js`\n const executorMatch = /^(.+)\\.operation\\.js$/.exec(scriptName);\n if (executorMatch) {\n const [, name] = executorMatch;\n return `executor--${name}`;\n }\n\n // Auth hook: `<authName>.<hookPoint>.hook.js`\n const authHookMatch = /^([^.]+)\\.([^.]+)\\.hook\\.js$/.exec(scriptName);\n if (authHookMatch) {\n const [, authName, hookPoint] = authHookMatch;\n return `auth-hook--${authName}--${hookPoint}`;\n }\n\n // Legacy (UNSPECIFIED) servers may not populate `type`. Fall back to\n // the historical bare-name heuristic for simple workflow job names.\n // Dotted job names cannot be disambiguated here and are left\n // unmapped; callers should upgrade the server for full coverage.\n if (executionType === FunctionExecution_Type.UNSPECIFIED && !scriptName.includes(\".\")) {\n return `workflow--${scriptName}`;\n }\n\n // Unknown format (ad-hoc test-run scripts, seed scripts, etc.) are\n // not in the registry; signal with null so the caller can fall back.\n return null;\n}\n\n/** Options for downloading a function registry script */\nexport interface DownloadFunctionScriptOptions {\n /** Operator client instance */\n client: OperatorClient;\n /** Workspace ID */\n workspaceId: string;\n /** Function registry name (translated from FunctionExecution.scriptName via scriptNameToRegistryName) */\n name: string;\n /** Optional content hash for a specific version (defaults to current version) */\n contentHash?: string;\n}\n\n/** Result of a successful function script download */\nexport interface DownloadedFunctionScript {\n /** Bundled script content as a UTF-8 string */\n code: string;\n /**\n * Server-side last-update timestamp of the registry entry, or null\n * when the metadata message omitted it. Callers comparing against an\n * execution timestamp use this to detect redeploys that happened\n * after the execution ran.\n */\n registryUpdatedAt: Date | null;\n}\n\n/**\n * Download a deployed function script.\n *\n * Returns the bundled script content together with the registry\n * entry's `updatedAt` timestamp. Returns null when the download fails\n * (script removed, network error, etc.) or when no content chunks are\n * received; errors are swallowed so callers can fall back to a\n * non-sourcemap display.\n * @param options - Download options\n * @returns Script content plus metadata, or null on failure / empty response\n */\nexport async function downloadFunctionScript(\n options: DownloadFunctionScriptOptions,\n): Promise<DownloadedFunctionScript | null> {\n const { client, workspaceId, name, contentHash } = options;\n try {\n const chunks: Uint8Array[] = [];\n let registryUpdatedAt: Date | null = null;\n for await (const response of client.downloadFunctionRegistryScript({\n workspaceId,\n name,\n contentHash,\n })) {\n if (response.payload.case === \"metadata\") {\n const updatedAt = response.payload.value.function?.updatedAt;\n if (updatedAt) registryUpdatedAt = timestampDate(updatedAt);\n } else if (response.payload.case === \"chunk\") {\n chunks.push(response.payload.value);\n }\n }\n if (chunks.length === 0) return null;\n return {\n code: Buffer.concat(chunks).toString(\"utf-8\"),\n registryUpdatedAt,\n };\n } catch (error) {\n logger.debug(`Failed to download function script \"${options.name}\": ${error}`);\n return null;\n }\n}\n","/**\n * Stack trace parsing, sourcemap-based source identification, and\n * formatted error display for the test-run command.\n *\n * The platform runtime automatically applies inline sourcemaps to V8\n * stack traces, so frame positions are already original source positions.\n * This module identifies which source file each frame belongs to via\n * reverse lookup (generatedPositionFor), then produces human-readable\n * output with file paths and code snippets.\n */\n\nimport { TraceMap, generatedPositionFor, originalPositionFor } from \"@jridgewell/trace-mapping\";\nimport * as path from \"pathe\";\nimport { styles } from \"@/cli/shared/logger\";\n\n/** A single frame parsed from a V8 stack trace */\nexport interface StackFrame {\n /** Function name (e.g. \"M\", \"Object.body\", \"<anonymous>\") */\n functionName: string;\n /** File URL (e.g. \"file:///test-run--error-test.js\") */\n file: string;\n /** Line number (1-based) */\n line: number;\n /** Column number (1-based) */\n column: number;\n}\n\n/** Result of parsing a V8 stack trace string */\nexport interface ParsedStackTrace {\n /** Error message with rpc prefix stripped */\n errorMessage: string;\n /** Parsed stack frames (only file:/// frames) */\n frames: StackFrame[];\n}\n\n// Matches: \" at functionName (file:///path:line:col)\"\n// Or: \" at file:///path:line:col\"\nconst STACK_FRAME_REGEX = /^\\s+at\\s+(?:(.+?)\\s+\\()?(file:\\/\\/\\/.+?):(\\d+):(\\d+)\\)?$/;\n\n// The rpc error prefix added by the platform\nconst RPC_ERROR_PREFIX = \"rpc error: code = Aborted desc = \";\n\n/**\n * Parse a V8 stack trace string into structured frames.\n * Only frames with `file:///` URLs are included (eval frames are skipped).\n * @param error - Raw error string potentially containing a V8 stack trace\n * @returns Parsed error message and stack frames\n */\nexport function parseStackTrace(error: string): ParsedStackTrace {\n const lines = error.split(\"\\n\");\n\n const messageLines: string[] = [];\n const frameLines: string[] = [];\n\n for (const line of lines) {\n if (/^\\s+at\\s+/.test(line)) {\n frameLines.push(line);\n } else if (frameLines.length === 0) {\n messageLines.push(line);\n }\n }\n\n let errorMessage = messageLines.join(\"\\n\");\n\n if (errorMessage.startsWith(RPC_ERROR_PREFIX)) {\n errorMessage = errorMessage.slice(RPC_ERROR_PREFIX.length);\n }\n\n const frames: StackFrame[] = [];\n for (const line of frameLines) {\n const match = STACK_FRAME_REGEX.exec(line);\n if (match) {\n frames.push({\n functionName: match[1] || \"<anonymous>\",\n file: match[2],\n line: Number(match[3]),\n column: Number(match[4]),\n });\n }\n }\n\n return { errorMessage, frames };\n}\n\nconst INLINE_SOURCEMAP_REGEX =\n /\\/\\/[#@]\\s*sourceMappingURL=data:application\\/json[^,]*;base64,(.+)$/m;\n\n/** Original source position resolved from a sourcemap */\nexport interface MappedSourcePosition {\n source: string;\n line: number;\n column: number;\n name: string | null;\n}\n\n/** A stack frame mapped back to original source */\nexport interface MappedStackFrame {\n /** The original parsed frame */\n original: StackFrame;\n /** Mapped source position, or null if mapping failed */\n mapped: MappedSourcePosition | null;\n}\n\n/**\n * Extract an inline sourcemap from bundled code and return a TraceMap.\n * @param bundledCode - Bundled JavaScript code potentially containing an inline sourcemap\n * @returns TraceMap instance, or null if no valid inline sourcemap is found\n */\nexport function extractInlineSourcemap(bundledCode: string): TraceMap | null {\n const match = INLINE_SOURCEMAP_REGEX.exec(bundledCode);\n if (!match) return null;\n\n try {\n const decoded = Buffer.from(match[1], \"base64\").toString(\"utf-8\");\n const rawSourceMap = JSON.parse(decoded);\n return new TraceMap(rawSourceMap);\n } catch {\n return null;\n }\n}\n\n/**\n * Map parsed stack frames to their source files using a TraceMap.\n *\n * The platform runtime applies inline sourcemaps automatically, so V8\n * reports already-mapped original source positions in stack traces.\n * This function uses generatedPositionFor to reverse-lookup which source\n * file each frame's line:column belongs to.\n * @param frames - Parsed stack frames (positions are already original source positions)\n * @param traceMap - TraceMap from inline sourcemap, or null\n * @returns Frames with identified source files\n */\nexport function mapStackFrames(\n frames: StackFrame[],\n traceMap: TraceMap | null,\n): MappedStackFrame[] {\n return frames.map((frame) => {\n if (!traceMap) {\n return { original: frame, mapped: null };\n }\n\n try {\n // Iterate in reverse: user code and entry file are typically last\n // in the sources array, while SDK internals and node_modules come first.\n for (let i = traceMap.sources.length - 1; i >= 0; i--) {\n const source = traceMap.sources[i];\n if (source == null) continue;\n\n const genPos = generatedPositionFor(traceMap, {\n source,\n line: frame.line,\n column: frame.column - 1, // V8 is 1-based, trace-mapping is 0-based\n });\n\n if (genPos.line == null) continue;\n\n // Round-trip validation: generatedPositionFor uses\n // GREATEST_LOWER_BOUND bias by default, so it may return a\n // near-match when the queried source has a mapping on the target\n // line at an earlier column. Verify the generated position maps\n // back to the exact (source, line, column) we queried before\n // accepting the match; otherwise try the next source.\n const origPos = originalPositionFor(traceMap, {\n line: genPos.line,\n column: genPos.column,\n });\n if (\n origPos.source !== source ||\n origPos.line !== frame.line ||\n origPos.column !== frame.column - 1\n ) {\n continue;\n }\n\n return {\n original: frame,\n mapped: {\n source,\n line: frame.line,\n column: frame.column,\n name: null,\n },\n };\n }\n\n return { original: frame, mapped: null };\n } catch {\n return { original: frame, mapped: null };\n }\n });\n}\n\n/**\n * Detect the URI scheme for opening files based on VISUAL/EDITOR env vars.\n * @returns \"vscode\" if the editor looks like VS Code, otherwise null (use file://)\n */\nfunction detectEditorScheme(): string | null {\n const editor = process.env.VISUAL || process.env.EDITOR || \"\";\n if (/\\bcode\\b/.test(editor)) return \"vscode\";\n return null;\n}\n\n/**\n * Wrap text in an OSC 8 terminal hyperlink.\n * @param uri - URI to open when the link is clicked\n * @param text - Visible text displayed in the terminal\n * @returns Escaped string with OSC 8 sequences\n */\nfunction osc8Link(uri: string, text: string): string {\n return `\\x1b]8;;${uri}\\x07${text}\\x1b]8;;\\x07`;\n}\n\n/**\n * Build a clickable terminal link for a source location.\n * Uses vscode:// URI if the editor is VS Code, otherwise file:// URI.\n * @param displayPath - Path to display in the terminal\n * @param absolutePath - Absolute file path for the URI\n * @param line - 1-based line number\n * @param column - 1-based column number\n * @returns OSC 8 hyperlinked location string\n */\nfunction buildSourceLink(\n displayPath: string,\n absolutePath: string,\n line: number,\n column: number,\n): string {\n const location = `${displayPath}:${line}:${column}`;\n const scheme = detectEditorScheme();\n if (scheme === \"vscode\") {\n return osc8Link(`vscode://file${absolutePath}:${line}:${column}`, location);\n }\n return osc8Link(`file://${absolutePath}`, location);\n}\n\nconst SNIPPET_CONTEXT_LINES = 2;\n\n/**\n * Build a code snippet around a target line from source content.\n * Shows SNIPPET_CONTEXT_LINES above and below with line numbers.\n * The target line is marked with `>` and highlighted.\n * @param content - Full source file content\n * @param targetLine - 1-based line number to highlight\n * @returns Formatted snippet string\n */\nfunction buildCodeSnippet(content: string, targetLine: number): string {\n const lines = content.split(\"\\n\");\n const start = Math.max(0, targetLine - 1 - SNIPPET_CONTEXT_LINES);\n const end = Math.min(lines.length, targetLine + SNIPPET_CONTEXT_LINES);\n\n const gutterWidth = String(end).length;\n const snippetLines: string[] = [];\n\n for (let i = start; i < end; i++) {\n const lineNum = i + 1;\n const gutter = String(lineNum).padStart(gutterWidth);\n const lineContent = lines[i];\n\n if (lineNum === targetLine) {\n snippetLines.push(` ${styles.error(\">\")} ${styles.error(`${gutter} | ${lineContent}`)}`);\n } else {\n snippetLines.push(` ${styles.dim(`${gutter} | ${lineContent}`)}`);\n }\n }\n\n return snippetLines.join(\"\\n\");\n}\n\n/**\n * Format mapped stack frames into a human-readable error display.\n * Includes file paths (clickable in terminals), code snippets, and\n * falls back to raw frame info for unmapped frames.\n * @param errorMessage - Cleaned error message\n * @param frames - Mapped stack frames\n * @param traceMap - TraceMap for retrieving source content (may be null)\n * @param bundleDir - Absolute path to bundle output directory for resolving source paths\n * @returns Formatted error string for display\n */\nexport function formatMappedError(\n errorMessage: string,\n frames: MappedStackFrame[],\n traceMap: TraceMap | null,\n bundleDir?: string,\n): string {\n const parts: string[] = [` ${styles.error(errorMessage)}`];\n\n for (const frame of frames) {\n if (frame.mapped) {\n const { source, line, column, name } = frame.mapped;\n const absolutePath = bundleDir ? path.resolve(bundleDir, source) : path.resolve(source);\n const rel = path.relative(process.cwd(), absolutePath);\n // Only paths escaping cwd (starting with `..`) are shown as-is; all\n // other relative paths get an explicit `./` prefix so dotfiles like\n // `.tailor-sdk/...` are not mistaken for relative-path markers.\n const displaySource = rel.startsWith(\"..\") ? rel : `./${rel}`;\n const fnName = name ?? frame.original.functionName;\n const link = buildSourceLink(displaySource, absolutePath, line, column);\n parts.push(`\\n at ${fnName} (${link})`);\n\n if (traceMap) {\n const sourceIndex = traceMap.sources.indexOf(source);\n if (sourceIndex !== -1) {\n const content = traceMap.sourcesContent?.[sourceIndex];\n if (content) {\n parts.push(buildCodeSnippet(content, line));\n }\n }\n }\n } else {\n const file = frame.original.file.replace(/^file:\\/\\/\\//, \"\");\n const location = `${file}:${frame.original.line}:${frame.original.column}`;\n parts.push(`\\n ${styles.dim(`at ${frame.original.functionName} (${location})`)}`);\n }\n }\n\n return parts.join(\"\\n\");\n}\n\n/**\n * Format an error string with sourcemap-based source locations.\n * This is the main entry point for test-run error display.\n *\n * The platform runtime applies inline sourcemaps automatically, so V8\n * stack frames already contain original source positions. This function\n * identifies which source file each frame belongs to and formats the\n * error with file paths, line numbers, and code snippets.\n *\n * Returns null if sourcemap processing is not possible (no inline\n * sourcemap, no stack trace, or processing error).\n * @param error - Raw error string from script execution (may contain V8 stack trace)\n * @param bundledCode - Bundled JavaScript code (may contain inline sourcemap)\n * @param bundleDir - Absolute path to the bundle output directory (sourcemap paths are relative to this)\n * @returns Formatted error string, or null to fall back to default display\n */\nexport function formatErrorWithSourcemap(\n error: string,\n bundledCode: string,\n bundleDir: string,\n): string | null {\n try {\n const { errorMessage, frames } = parseStackTrace(error);\n if (frames.length === 0) return null;\n\n const traceMap = extractInlineSourcemap(bundledCode);\n if (!traceMap) return null;\n\n const mappedFrames = mapStackFrames(frames, traceMap);\n\n if (mappedFrames.some((f) => f.mapped !== null)) {\n return formatMappedError(errorMessage, mappedFrames, traceMap, bundleDir);\n }\n\n return null;\n } catch {\n return null;\n }\n}\n","import { timestampDate } from \"@bufbuild/protobuf/wkt\";\nimport { FunctionExecution_Type } from \"@tailor-proto/tailor/v1/function_resource_pb\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { pagedLogArgs, toPageDirection, workspaceArgs } from \"@/cli/shared/args\";\nimport { fetchPaged, initOperatorClient, type OperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { formatKeyValueTable } from \"@/cli/shared/format\";\nimport { functionExecutionStatusToString } from \"@/cli/shared/function-execution\";\nimport {\n downloadFunctionScript,\n scriptNameToRegistryName,\n} from \"@/cli/shared/function-script-download\";\nimport { logger, styles } from \"@/cli/shared/logger\";\nimport { formatErrorWithSourcemap } from \"@/cli/shared/stack-trace\";\nimport type { FunctionExecution } from \"@tailor-proto/tailor/v1/function_resource_pb\";\n\ninterface FunctionExecutionListInfo {\n id: string;\n scriptName: string;\n status: string;\n type: string;\n startedAt: Date | null;\n finishedAt: Date | null;\n}\n\ninterface FunctionExecutionErrorDisplay {\n name: string;\n message: string;\n stackTrace: string;\n}\n\ninterface FunctionExecutionDetailInfo extends FunctionExecutionListInfo {\n logs: string;\n result: string;\n error: FunctionExecutionErrorDisplay | null;\n}\n\n/**\n * Convert function execution type enum to string.\n * @param type - Function execution type enum value\n * @returns Type string representation\n */\nfunction functionExecutionTypeToString(type: FunctionExecution_Type): string {\n switch (type) {\n case FunctionExecution_Type.STANDARD:\n return \"STANDARD\";\n case FunctionExecution_Type.JOB:\n return \"JOB\";\n default:\n return \"UNSPECIFIED\";\n }\n}\n\n/**\n * Transform FunctionExecution to FunctionExecutionListInfo for list display.\n * @param execution - FunctionExecution from proto\n * @returns Function execution list info\n */\nfunction toFunctionExecutionListInfo(execution: FunctionExecution): FunctionExecutionListInfo {\n return {\n id: execution.id,\n scriptName: execution.scriptName,\n status: functionExecutionStatusToString(execution.status),\n type: functionExecutionTypeToString(execution.type),\n startedAt: execution.startedAt ? timestampDate(execution.startedAt) : null,\n finishedAt: execution.finishedAt ? timestampDate(execution.finishedAt) : null,\n };\n}\n\n/**\n * Transform FunctionExecution to FunctionExecutionDetailInfo for detail display.\n * @param execution - FunctionExecution from proto\n * @returns Function execution detail info\n */\nfunction toFunctionExecutionDetailInfo(execution: FunctionExecution): FunctionExecutionDetailInfo {\n return {\n ...toFunctionExecutionListInfo(execution),\n logs: execution.logs,\n result: execution.result,\n error: execution.error\n ? {\n name: execution.error.name,\n message: execution.error.message,\n stackTrace: execution.error.stackTrace,\n }\n : null,\n };\n}\n\n/**\n * Compose a V8-style error string from a FunctionErrorInfo so that it\n * can be parsed by `parseStackTrace`.\n *\n * `Error.prototype.stack` in V8 begins with `Name: message`, but the\n * platform may store only the frame lines; in that case prepend the\n * message line. When `stackTrace` is empty, return only `Name: message`.\n * @param error - Function error info from FunctionExecution\n * @returns Error string suitable for parseStackTrace\n */\nexport function composeExecutionErrorString(error: FunctionExecutionErrorDisplay): string {\n const { name, message, stackTrace } = error;\n if (!stackTrace) return `${name}: ${message}`;\n const firstLine = stackTrace.split(\"\\n\", 1)[0] ?? \"\";\n if (/^\\s+at\\s+/.test(firstLine)) {\n return `${name}: ${message}\\n${stackTrace}`;\n }\n return stackTrace;\n}\n\n/**\n * Plain-text fallback used when sourcemap mapping is unavailable.\n * Shows `Name: message` then the raw stack trace lines (dimmed).\n *\n * Uses `composeExecutionErrorString` to produce a canonical\n * `Name: message\\n<frames>` string first, so the header is never\n * duplicated when `stackTrace` already begins with `Name: message`.\n * @param error - Function error info from FunctionExecution\n * @returns Formatted fallback string for display\n */\nfunction formatExecutionErrorFallback(error: FunctionExecutionErrorDisplay): string {\n const composed = composeExecutionErrorString(error);\n const [headerLine, ...frameLines] = composed.split(\"\\n\");\n return [\n ` ${styles.error(headerLine ?? \"\")}`,\n ...frameLines.map((line) => ` ${styles.dim(line)}`),\n ].join(\"\\n\");\n}\n\n/**\n * Format an execution error for display, applying sourcemap mapping\n * when bundled code is available.\n * @param error - Function error info from FunctionExecution\n * @param bundledCode - Downloaded bundled script content (may be null)\n * @returns Formatted error string for display\n */\nexport function formatExecutionError(\n error: FunctionExecutionErrorDisplay,\n bundledCode: string | null,\n): string {\n if (bundledCode && error.stackTrace) {\n const errorString = composeExecutionErrorString(error);\n const formatted = formatErrorWithSourcemap(errorString, bundledCode, process.cwd());\n if (formatted) return formatted;\n }\n return formatExecutionErrorFallback(error);\n}\n\ninterface PrintFunctionExecutionDetailOptions {\n detail: FunctionExecutionDetailInfo;\n /** Bundled script content for sourcemap-based stack trace mapping (optional) */\n bundledCode?: string | null;\n}\n\n/**\n * Print function execution detail in a human-readable format.\n * @param options - Print options\n * @param options.detail - Function execution detail info\n * @param options.bundledCode - Downloaded bundled script content (used for sourcemap mapping)\n */\nfunction printFunctionExecutionDetail(options: PrintFunctionExecutionDetailOptions) {\n const { detail, bundledCode } = options;\n const formatDate = (date: Date | null): string => (date ? date.toISOString() : \"N/A\");\n\n const summaryData: [string, string][] = [\n [\"id\", detail.id],\n [\"scriptName\", detail.scriptName],\n [\"status\", detail.status],\n [\"type\", detail.type],\n [\"startedAt\", formatDate(detail.startedAt)],\n [\"finishedAt\", formatDate(detail.finishedAt)],\n ];\n logger.out(formatKeyValueTable(summaryData));\n\n if (detail.logs) {\n logger.log(styles.bold(\"\\nLogs:\"));\n for (const line of detail.logs.split(\"\\n\")) {\n logger.log(` ${line}`);\n }\n }\n\n if (detail.result) {\n logger.log(styles.bold(\"\\nResult:\"));\n try {\n const parsed = JSON.parse(detail.result);\n logger.log(` ${JSON.stringify(parsed, null, 2).split(\"\\n\").join(\"\\n \")}`);\n } catch {\n logger.log(` ${detail.result}`);\n }\n }\n\n if (detail.error) {\n logger.log(styles.bold(\"\\nError:\"));\n logger.log(formatExecutionError(detail.error, bundledCode ?? null));\n }\n}\n\ninterface DownloadScriptForMappingOptions {\n client: OperatorClient;\n workspaceId: string;\n /** FunctionExecution.scriptName (not the function registry name) */\n scriptName: string;\n /**\n * FunctionExecution.type. Used as the discriminator for the registry\n * name translation so that workflow job names containing dots are\n * not misread as resolver / seed scripts.\n */\n executionType: FunctionExecution_Type;\n /**\n * FunctionExecution.contentHash. When non-empty, the registry\n * download is pinned to this exact bundle so the stack trace maps\n * against the code that actually ran, regardless of subsequent\n * redeploys. Empty on older servers that did not populate the\n * field; in that case the caller falls back to a timestamp-based\n * staleness check using `executionStartedAt`.\n */\n executionContentHash: string;\n /**\n * When the execution started. Used as a fallback staleness signal\n * only when `executionContentHash` is empty: if the current registry\n * entry's `updatedAt` is strictly newer, the downloaded bundle may\n * differ from what was actually executed, so mapping is skipped to\n * avoid misleading source locations.\n */\n executionStartedAt: Date | null;\n}\n\n/**\n * Download a deployed function script for sourcemap mapping. Logs a\n * debug message on failure but never throws. Error display falls back\n * to a plain-text format when the script cannot be retrieved or when\n * the current registry entry is stale relative to the execution.\n *\n * When `executionContentHash` is non-empty, the download is pinned to\n * that exact bundle so mapping stays correct across redeploys. When\n * empty (older servers), falls back to comparing `registryUpdatedAt`\n * against `executionStartedAt`.\n *\n * `FunctionExecution.scriptName` does not match the function registry\n * name directly; `scriptNameToRegistryName` translates between the two\n * formats.\n * @param options - Lookup options\n * @param options.client - Operator client instance\n * @param options.workspaceId - Workspace ID\n * @param options.scriptName - Script name (matches FunctionExecution.scriptName)\n * @param options.executionType - Execution type used to discriminate registry name translation\n * @param options.executionContentHash - Content hash of the bundle that ran; pins the download when non-empty\n * @param options.executionStartedAt - Execution start timestamp used as fallback staleness signal\n * @returns Bundled script content, or null when unavailable / stale\n */\nexport async function downloadScriptForMapping(\n options: DownloadScriptForMappingOptions,\n): Promise<string | null> {\n const {\n client,\n workspaceId,\n scriptName,\n executionType,\n executionContentHash,\n executionStartedAt,\n } = options;\n const registryName = scriptNameToRegistryName(scriptName, executionType);\n if (registryName == null) {\n logger.debug(\n `Script \"${scriptName}\" is not a deployed registry script (e.g. test-run or seed); skipping sourcemap mapping.`,\n );\n return null;\n }\n\n if (executionContentHash !== \"\") {\n const pinned = await downloadFunctionScript({\n client,\n workspaceId,\n name: registryName,\n contentHash: executionContentHash,\n });\n if (pinned == null) {\n logger.debug(\n `Could not download pinned script \"${scriptName}\" (registry: \"${registryName}\", contentHash: \"${executionContentHash}\") for stack trace mapping; showing raw stack trace.`,\n );\n return null;\n }\n return pinned.code;\n }\n\n // Fallback for older servers that did not populate\n // FunctionExecution.contentHash: download the current bundle and\n // skip mapping if the registry was updated after the execution\n // started.\n const result = await downloadFunctionScript({ client, workspaceId, name: registryName });\n if (result == null) {\n logger.debug(\n `Could not download script \"${scriptName}\" (registry: \"${registryName}\") for stack trace mapping; showing raw stack trace.`,\n );\n return null;\n }\n if (\n executionStartedAt != null &&\n result.registryUpdatedAt != null &&\n result.registryUpdatedAt.getTime() > executionStartedAt.getTime()\n ) {\n logger.debug(\n `Registry script \"${registryName}\" was updated at ${result.registryUpdatedAt.toISOString()} after execution started at ${executionStartedAt.toISOString()}; skipping sourcemap mapping to avoid stale source locations.`,\n );\n return null;\n }\n return result.code;\n}\n\nexport const logsCommand = defineAppCommand({\n name: \"logs\",\n description: \"List or get function execution logs.\",\n notes: `When viewing a specific execution that failed, the command displays error details with the stack trace mapped back to your original source files (clickable file links and code snippets, matching \\`function test-run\\` output).\n\nStack traces stay accurate even after later redeploys, because the trace is resolved against the exact build that produced the execution. If that build is no longer available, the command falls back to a plain-text error display.`,\n examples: [\n {\n cmd: \"\",\n desc: \"List all function execution logs\",\n },\n {\n cmd: \"<execution-id>\",\n desc: \"Get execution details with logs\",\n },\n {\n cmd: \"--json\",\n desc: \"Output as JSON\",\n },\n {\n cmd: \"<execution-id> --json\",\n desc: \"Get execution details as JSON\",\n },\n ],\n args: z\n .object({\n ...workspaceArgs,\n ...pagedLogArgs,\n \"execution-id\": arg(z.string().optional(), {\n positional: true,\n description: \"Execution ID (if provided, shows details with logs)\",\n }),\n })\n .strict(),\n run: async (args) => {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n if (args.executionId) {\n const { execution } = await client.getFunctionExecution({\n workspaceId,\n executionId: args.executionId,\n });\n\n if (!execution) {\n throw new Error(`Function execution '${args.executionId}' not found.`);\n }\n\n const detail = toFunctionExecutionDetailInfo(execution);\n\n if (args.json) {\n logger.out(detail);\n } else {\n // Download the deployed script when an error is present so the\n // stack trace can be mapped back to original sources via the\n // inline sourcemap. Failure (script removed, no permission, etc.)\n // is non-fatal; we fall back to a plain-text error display.\n const bundledCode = detail.error\n ? await downloadScriptForMapping({\n client,\n workspaceId,\n scriptName: detail.scriptName,\n executionType: execution.type,\n executionContentHash: execution.contentHash,\n executionStartedAt: detail.startedAt,\n })\n : null;\n printFunctionExecutionDetail({ detail, bundledCode });\n }\n } else {\n const pageDirection = toPageDirection(args.order);\n const executions = await fetchPaged(\n async (pageToken, pageSize) => {\n const { executions, nextPageToken } = await client.listFunctionExecutions({\n workspaceId,\n pageToken,\n pageSize,\n pageDirection,\n });\n return [executions, nextPageToken];\n },\n { limit: args.limit },\n );\n\n const logs = executions.map(toFunctionExecutionListInfo);\n\n if (logs.length === 0 && !args.json) {\n logger.info(\"No function execution logs found.\");\n return;\n }\n logger.out(logs);\n }\n },\n});\n","/**\n * Bundler for function test-run command\n *\n * Bundles a single function file for execution via the TestExecScript API.\n * Generates an entry file based on the detected function type and bundles\n * with rolldown, following the same patterns as the existing bundlers.\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"pathe\";\nimport { resolveTSConfig } from \"pkg-types\";\nimport * as rolldown from \"rolldown\";\nimport {\n createLogLevelTreeshakeOptions,\n resolveBundleLogLevel,\n} from \"@/cli/shared/bundle-log-level\";\nimport { getDistDir } from \"@/cli/shared/dist-dir\";\nimport { composeFunctionTreeshakeOptions } from \"@/cli/shared/function-treeshake\";\nimport { resolveInlineSourcemap } from \"@/cli/shared/inline-sourcemap\";\nimport { INVOKER_EXPR } from \"@/cli/shared/runtime-exprs\";\nimport ml from \"@/utils/multiline\";\nimport type { DetectedFunction } from \"./detect\";\nimport type { LogLevelInput } from \"@/types/app-config\";\n\n/** Machine user info resolved from config and API for bundle-time user context. */\nexport interface ResolvedMachineUser {\n /** Machine user name */\n name: string;\n /** Machine user ID (UUID from API, or nil UUID if unavailable) */\n id: string;\n /** Attributes from config (null if not found in config, e.g. external auth) */\n attributes: Record<string, unknown> | null;\n /** Attribute list from config */\n attributeList: unknown[];\n}\n\ninterface BundleForTestRunOptions {\n /** Detected function info */\n detected: DetectedFunction;\n /** Absolute path to the source file */\n sourceFile: string;\n /** Environment variables (injected into workflow job bundles) */\n env?: Record<string, string | number | boolean>;\n /** Inline sourcemap config value from defineConfig */\n inlineSourcemap?: boolean;\n /** Log level config value from defineConfig */\n logLevel?: LogLevelInput;\n /** Machine user info for injecting user context into the bundle */\n machineUser: ResolvedMachineUser;\n /** Workspace ID for user context */\n workspaceId: string;\n}\n\ninterface BundleForTestRunResult {\n /** The bundled JavaScript code */\n bundledCode: string;\n /** Name used for the script */\n scriptName: string;\n}\n\n/**\n * Bundle a function file for test-run execution via TestExecScript API.\n * @param options - Bundle options\n * @returns Bundled code and script name\n */\nexport async function bundleForTestRun(\n options: BundleForTestRunOptions,\n): Promise<BundleForTestRunResult> {\n const { detected, sourceFile, env = {}, machineUser, workspaceId } = options;\n const inlineSourcemap = resolveInlineSourcemap(options.inlineSourcemap);\n const bundleLogLevel = resolveBundleLogLevel(options.logLevel);\n\n const outputDir = path.resolve(getDistDir(), \"test-run\");\n fs.mkdirSync(outputDir, { recursive: true });\n\n const baseName = `test-run--${detected.name}`;\n const scriptName = `${baseName}.js`;\n const entryPath = path.join(outputDir, `${baseName}.entry.js`);\n\n const entryContent = generateEntry(detected, sourceFile, env, machineUser, workspaceId);\n fs.writeFileSync(entryPath, entryContent);\n\n let tsconfig: string | undefined;\n try {\n tsconfig = await resolveTSConfig();\n } catch {\n tsconfig = undefined;\n }\n\n const buildResult = await rolldown.build({\n input: entryPath,\n write: false,\n output: {\n format: \"esm\",\n sourcemap: inlineSourcemap ? \"inline\" : true,\n minify: inlineSourcemap\n ? {\n mangle: {\n keepNames: true,\n },\n }\n : true,\n codeSplitting: false,\n // Emit sourcemap `sources` relative to cwd so stack traces resolve\n // back to paths a user can open (e.g. `resolvers/add.ts`), not the\n // rolldown-default virtual output dir which produces spurious `..`\n // segments.\n dir: process.cwd(),\n },\n tsconfig,\n treeshake: composeFunctionTreeshakeOptions([createLogLevelTreeshakeOptions(bundleLogLevel)]),\n logLevel: \"silent\",\n } as rolldown.BuildOptions);\n\n const bundledCode = buildResult.output[0].code;\n\n return { bundledCode, scriptName };\n}\n\n/**\n * Generate entry file content based on the detected function type.\n * @param detected - Detected function info\n * @param sourceFile - Absolute path to the source file\n * @param env - Environment variables for workflow job bundles\n * @param machineUser - Resolved machine user info\n * @param workspaceId - Workspace ID\n * @returns Entry file content string\n */\nfunction generateEntry(\n detected: DetectedFunction,\n sourceFile: string,\n env: Record<string, string | number | boolean>,\n machineUser: ResolvedMachineUser,\n workspaceId: string,\n): string {\n const absoluteSourcePath = path.resolve(sourceFile);\n\n switch (detected.type) {\n case \"plain\":\n if (detected.namedMain) {\n return ml /* js */ `\n export { main } from \"${absoluteSourcePath}\";\n `;\n }\n return ml /* js */ `\n import _fn from \"${absoluteSourcePath}\";\n export { _fn as main };\n `;\n\n case \"resolver\": {\n // Mirrors the production resolver bundler (services/resolver/bundler.ts).\n // In production, the operationHook injects user/env into context.\n // For test-run, we embed machine user info since there's no operationHook.\n const userExpr = buildMachineUserExpr(machineUser, workspaceId);\n return ml /* js */ `\n import _internalResolver from \"${absoluteSourcePath}\";\n import { t } from \"@tailor-platform/sdk\";\n\n const _env = ${JSON.stringify(env)};\n const _user = ${userExpr};\n\n const $tailor_resolver_body = async (context) => {\n const _invoker = ${INVOKER_EXPR};\n if (_internalResolver.input) {\n const result = t.object(_internalResolver.input).parse({\n value: context,\n data: context,\n user: _user,\n });\n\n if (result.issues) {\n throw new TailorErrors(result.issues.map(issue => ({\n message: issue.message,\n path: issue.path ?? [],\n })));\n }\n }\n\n const enrichedContext = { input: context, env: _env, user: _user, invoker: _invoker };\n return _internalResolver.body(enrichedContext);\n };\n\n export { $tailor_resolver_body as main };\n `;\n }\n\n case \"executor\": {\n // Mirrors the production executor bundler (services/executor/bundler.ts).\n // In production, buildExecutorArgsExpr injects actor/env into args.\n // For test-run, we embed machine user as actor.\n const actorExpr = buildMachineActorExpr(machineUser, workspaceId);\n return ml /* js */ `\n import _internalExecutor from \"${absoluteSourcePath}\";\n\n const _env = ${JSON.stringify(env)};\n const _actor = ${actorExpr};\n\n const __executor_function = async (args) => {\n const _invoker = ${INVOKER_EXPR};\n return _internalExecutor.operation.body({ ...args, env: _env, actor: _actor, invoker: _invoker });\n };\n\n export { __executor_function as main };\n `;\n }\n\n case \"workflow-job\": {\n // Mirrors the production workflow bundler (services/workflow/bundler.ts).\n // Note: user context is not available in TestExecScript for workflow jobs.\n // The production workflow bundler's user mapping is being fixed in fix/workflow-user.\n const exportName = detected.exportName!;\n return ml /* js */ `\n import { ${exportName} } from \"${absoluteSourcePath}\";\n\n const env = ${JSON.stringify(env)};\n\n export async function main(input) {\n const invoker = ${INVOKER_EXPR};\n return await ${exportName}.body(input, { env, invoker });\n }\n `;\n }\n }\n}\n\n/**\n * Build a JSON expression for a machine user TailorUser object.\n * @param machineUser - Resolved machine user info\n * @param workspaceId - Workspace ID\n * @returns JSON string for the user expression\n */\nfunction buildMachineUserExpr(machineUser: ResolvedMachineUser, workspaceId: string): string {\n return JSON.stringify({\n id: machineUser.id,\n type: \"machine_user\",\n workspaceId,\n attributes: machineUser.attributes,\n attributeList: machineUser.attributeList,\n });\n}\n\n/**\n * Build a JSON expression for a machine user TailorActor object.\n * @param machineUser - Resolved machine user info\n * @param workspaceId - Workspace ID\n * @returns JSON string for the actor expression\n */\nfunction buildMachineActorExpr(machineUser: ResolvedMachineUser, workspaceId: string): string {\n return JSON.stringify({\n workspaceId,\n userId: machineUser.id,\n attributes: machineUser.attributes,\n attributeList: machineUser.attributeList,\n userType: \"USER_TYPE_MACHINE_USER\",\n });\n}\n","/**\n * Function type detection for test-run command\n *\n * Detects the function type (resolver, executor, workflow job, or plain function)\n * by dynamically importing the module and checking against known schemas.\n */\n\nimport { pathToFileURL } from \"node:url\";\nimport * as path from \"pathe\";\nimport { ExecutorSchema } from \"@/parser/service/executor\";\nimport { ResolverSchema } from \"@/parser/service/resolver\";\nimport { WorkflowJobSchema } from \"@/parser/service/workflow\";\n\nexport type FunctionType = \"resolver\" | \"executor\" | \"workflow-job\" | \"plain\";\n\n/** Minimal schema interface for local format detection (subset of TailorField) */\ninterface InputSchema {\n parse(args: { value: unknown; data: unknown; user: Record<string, unknown> }): {\n issues?: readonly { message: string; path?: readonly (string | number | symbol)[] }[];\n };\n}\n\nexport interface DetectedFunction {\n /** Detected function type */\n type: FunctionType;\n /** Function name (resolver name, executor name, job name, or filename-derived) */\n name: string;\n /** For workflow jobs: the TypeScript export name needed for bundling */\n exportName?: string;\n /** For plain functions: whether main is a named export rather than default export */\n namedMain?: boolean;\n /** For resolvers: whether the resolver defines an input schema */\n hasInput?: boolean;\n /** For resolvers with input: pre-built schema object with .parse() for local format detection */\n inputSchema?: InputSchema;\n}\n\ninterface DetectFunctionOptions {\n /** Absolute path to the function file */\n filePath: string;\n /** Workflow job name to select (matches the `name` field of createWorkflowJob) */\n jobName?: string;\n}\n\n/**\n * Detect the function type from a file by importing it and checking against schemas.\n * @param options - Detection options\n * @returns Detected function information\n */\nexport async function detectFunctionType(\n options: DetectFunctionOptions,\n): Promise<DetectedFunction> {\n const { filePath, jobName } = options;\n\n const module = await import(pathToFileURL(filePath).href);\n\n // Priority: resolver → executor → workflow job → plain function\n\n // 1. Check resolver\n const resolverResult = ResolverSchema.safeParse(module.default);\n if (resolverResult.success) {\n const rawInput = module.default.input;\n let inputSchema: DetectedFunction[\"inputSchema\"];\n if (rawInput) {\n // Build schema object for local format detection.\n const { t } = await import(\"@/configure/types\");\n inputSchema = t.object(rawInput) as InputSchema;\n }\n return {\n type: \"resolver\",\n name: resolverResult.data.name,\n hasInput: rawInput != null,\n inputSchema,\n };\n }\n\n // 2. Check executor (only function/jobFunction kinds)\n const executorResult = ExecutorSchema.safeParse(module.default);\n if (executorResult.success) {\n const { operation } = executorResult.data;\n if (operation.kind === \"function\" || operation.kind === \"jobFunction\") {\n return { type: \"executor\", name: executorResult.data.name };\n }\n }\n\n // 3. Check workflow jobs (scan all named exports)\n const workflowJobResult = detectWorkflowJob(module, jobName);\n if (workflowJobResult) {\n return workflowJobResult;\n }\n\n // 4. Check plain function (default export or named export \"main\")\n if (typeof module.default === \"function\") {\n const name = deriveNameFromPath(filePath);\n return { type: \"plain\", name };\n }\n\n if (typeof module.main === \"function\") {\n const name = deriveNameFromPath(filePath);\n return { type: \"plain\", name, namedMain: true };\n }\n\n throw new Error(\n `Could not detect function type from ${filePath}.\\n` +\n \"The file must have one of:\\n\" +\n \" - A default-exported resolver (createResolver)\\n\" +\n \" - A default-exported executor (createExecutor) with function/jobFunction operation\\n\" +\n \" - A named-exported workflow job (createWorkflowJob)\\n\" +\n \" - A default-exported function\\n\" +\n ' - A named-exported \"main\" function',\n );\n}\n\n/**\n * Scan all named exports for workflow jobs.\n * If jobName is specified, find the job whose `.name` matches.\n * If not specified and exactly one job exists, use it.\n * If multiple jobs exist, throw an error with the list.\n * @param module - The imported module\n * @param jobName - Workflow job name to select\n * @returns Detected function or null if no workflow jobs found\n */\nfunction detectWorkflowJob(\n module: Record<string, unknown>,\n jobName?: string,\n): DetectedFunction | null {\n const jobs: Array<{ name: string; exportName: string }> = [];\n\n for (const [exportName, exportValue] of Object.entries(module)) {\n if (exportName === \"default\") continue;\n const result = WorkflowJobSchema.safeParse(exportValue);\n if (result.success) {\n jobs.push({ name: result.data.name, exportName });\n }\n }\n\n if (jobs.length === 0) {\n return null;\n }\n\n if (jobName) {\n const match = jobs.find((j) => j.name === jobName);\n if (!match) {\n const available = jobs.map((j) => ` - \"${j.name}\" (export: ${j.exportName})`).join(\"\\n\");\n throw new Error(`Workflow job \"${jobName}\" not found. Available jobs:\\n${available}`);\n }\n return { type: \"workflow-job\", name: match.name, exportName: match.exportName };\n }\n\n if (jobs.length === 1) {\n return { type: \"workflow-job\", name: jobs[0].name, exportName: jobs[0].exportName };\n }\n\n const available = jobs.map((j) => ` - \"${j.name}\" (export: ${j.exportName})`).join(\"\\n\");\n throw new Error(`Multiple workflow jobs found. Specify one with --name:\\n${available}`);\n}\n\n/**\n * Derive a script name from a file path (filename without extension).\n * @param filePath - Absolute path to the function file\n * @returns Filename without extension\n */\nfunction deriveNameFromPath(filePath: string): string {\n return path.basename(filePath, path.extname(filePath));\n}\n","/**\n * `tailor-sdk function test-run` command\n *\n * Bundles and executes a function on the Tailor Platform server\n * without deploying (applying) the application.\n */\n\nimport * as fs from \"node:fs\";\nimport { create } from \"@bufbuild/protobuf\";\nimport { AuthInvokerSchema } from \"@tailor-proto/tailor/v1/auth_resource_pb\";\nimport * as path from \"pathe\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient, type OperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadConfig } from \"@/cli/shared/config-loader\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger, styles } from \"@/cli/shared/logger\";\nimport { executeScript } from \"@/cli/shared/script-executor\";\nimport { formatErrorWithSourcemap } from \"@/cli/shared/stack-trace\";\nimport { bundleForTestRun, type ResolvedMachineUser } from \"./bundle\";\nimport { detectFunctionType, type DetectedFunction } from \"./detect\";\n\nexport const testRunCommand = defineAppCommand({\n name: \"test-run\",\n description: \"Run a function on the Tailor Platform server without deploying.\",\n args: z.object({\n ...workspaceArgs,\n file: arg(z.string(), {\n positional: true,\n description: \"Path to the function file\",\n }),\n name: arg(z.string().optional(), {\n alias: \"n\",\n description: \"Workflow job name to run (matches the `name` field of createWorkflowJob)\",\n }),\n arg: arg(z.string().optional(), {\n alias: \"a\",\n description: \"JSON argument to pass to the function\",\n }),\n \"machine-user\": arg(z.string().optional(), {\n alias: \"m\",\n description: \"Machine user name for authentication\",\n env: \"TAILOR_PLATFORM_MACHINE_USER_NAME\",\n }),\n config: arg(z.string().default(\"tailor.config.ts\"), {\n alias: \"c\",\n description: \"Path to SDK config file\",\n }),\n }),\n notes: `You can pass either a source file (\\`.ts\\`) or a pre-bundled file (\\`.js\\`).\nWhen a \\`.js\\` file is provided, detection and bundling are skipped and the file is executed as-is.\n\n> [!WARNING]\n> Workflow job \\`.trigger()\\` calls do not work in test-run mode.\n> Triggered jobs are not executed; only the target job's \\`body\\` function runs in isolation.`,\n examples: [\n {\n cmd: 'resolvers/add.ts --arg \\'{\"a\":1,\"b\":2}\\'',\n desc: \"Run a resolver with input arguments\",\n },\n {\n cmd: \"workflows/sample.ts --name validate-order\",\n desc: \"Run a specific workflow job by name\",\n },\n {\n cmd: 'build/resolvers/add.js --arg \\'{\"a\":1,\"b\":2}\\'',\n desc: \"Run a pre-bundled .js file directly\",\n },\n ],\n run: async (args) => {\n const jsonOutput = logger.jsonMode;\n\n // 1. Resolve and validate file path\n const filePath = path.resolve(args.file);\n if (!fs.existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n // 2. Load config (required)\n const { config } = await loadConfig(args.config);\n\n // 3. Resolve auth, workspace, and machine user info (needed before bundling)\n const authNamespace = resolveAuthNamespace(config.auth);\n const machineUserName = resolveMachineUserName(args[\"machine-user\"], config.auth);\n\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n const machineUser = await resolveMachineUser({\n client,\n workspaceId,\n authNamespace,\n machineUserName,\n authConfig: config.auth,\n });\n\n // 4. Resolve bundled code and script name\n const relativePath = path.relative(process.cwd(), filePath);\n const isPreBundled = filePath.endsWith(\".js\");\n let bundledCode: string;\n let scriptName: string;\n let functionType: string | undefined;\n let functionName: string | undefined;\n\n if (isPreBundled) {\n // Pre-bundled .js file\n scriptName = path.basename(filePath);\n bundledCode = fs.readFileSync(filePath, \"utf-8\");\n logger.info(`Using pre-bundled script ${styles.bold(scriptName)}`);\n } else {\n // Source file: detect type and bundle\n logger.info(`Detecting function type from ${styles.path(relativePath)}`);\n\n const detected = await detectFunctionType({\n filePath,\n jobName: args.name,\n });\n\n functionType = detected.type;\n functionName = detected.name;\n logger.info(`Detected: ${styles.bold(detected.type)} ${styles.info(`\"${detected.name}\"`)}`);\n\n if (detected.type === \"resolver\" && args.arg) {\n if (!detected.hasInput) {\n logger.warn(\n '--arg is ignored because this resolver has no input schema. Define \"input\" in your resolver to use --arg.',\n );\n args.arg = undefined;\n } else if (detected.inputSchema) {\n args.arg = resolveResolverArg(args.arg, detected.inputSchema, machineUser, workspaceId);\n }\n }\n\n logger.info(\"Bundling...\");\n ({ bundledCode, scriptName } = await bundleForTestRun({\n detected,\n sourceFile: filePath,\n env: config.env ?? {},\n inlineSourcemap: config.inlineSourcemap,\n logLevel: config.logLevel,\n machineUser,\n workspaceId,\n }));\n logger.info(`Bundled as ${styles.bold(scriptName)}`);\n }\n\n // 5. Execute via TestExecScript\n const authInvoker = create(AuthInvokerSchema, {\n namespace: authNamespace,\n machineUserName: machineUser.name,\n });\n\n logger.info(`Executing on workspace ${styles.dim(workspaceId)}...`);\n\n const result = await executeScript({\n client,\n workspaceId,\n name: scriptName,\n code: bundledCode,\n arg: args.arg,\n invoker: authInvoker,\n });\n\n // 7. Display result\n if (jsonOutput) {\n logger.out({\n success: result.success,\n scriptName,\n functionType,\n functionName,\n logs: result.logs,\n result: result.result,\n error: result.error,\n });\n } else {\n if (result.success) {\n logger.success(\"Execution succeeded\");\n } else {\n logger.error(\"Execution failed\");\n }\n\n if (result.logs?.trim()) {\n logger.log(styles.bold(\"\\nLogs:\"));\n for (const line of result.logs.split(\"\\n\")) {\n logger.log(` ${line}`);\n }\n }\n\n if (result.result && result.success) {\n logger.log(styles.bold(\"\\nResult:\"));\n try {\n const parsed = JSON.parse(result.result);\n logger.log(` ${JSON.stringify(parsed, null, 2).split(\"\\n\").join(\"\\n \")}`);\n } catch {\n logger.log(` ${result.result}`);\n }\n }\n\n if (result.error && !result.success) {\n logger.log(styles.bold(\"\\nError:\"));\n const formatted = formatErrorWithSourcemap(result.error, bundledCode, process.cwd());\n if (formatted) {\n logger.log(formatted);\n } else {\n logger.log(` ${styles.error(result.error)}`);\n }\n }\n }\n\n if (!result.success) {\n process.exit(1);\n }\n },\n});\n\n/**\n * Resolve auth namespace from config.\n * @param authConfig - Auth configuration from tailor.config.ts\n * @returns Resolved auth namespace\n */\nfunction resolveAuthNamespace(\n authConfig: { name: string; external?: boolean } | undefined,\n): string {\n if (authConfig?.name) {\n return authConfig.name;\n }\n throw new Error(\"Auth namespace is required. Ensure tailor.config.ts has an auth config.\");\n}\n\n/**\n * Resolve machine user name from CLI args or config. Priority: --machine-user > first key of config.auth.machineUsers\n * @param cliMachineUser - CLI --machine-user value\n * @param authConfig - Auth configuration from tailor.config.ts\n * @returns Resolved machine user name\n */\nfunction resolveMachineUserName(\n cliMachineUser: string | undefined,\n authConfig:\n | { name: string; external?: boolean; machineUsers?: Record<string, unknown> }\n | undefined,\n): string {\n if (cliMachineUser) {\n return cliMachineUser;\n }\n if (authConfig && !(\"external\" in authConfig && authConfig.external)) {\n const machineUsers = authConfig.machineUsers;\n if (machineUsers) {\n const keys = Object.keys(machineUsers);\n if (keys.length > 0) {\n return keys[0];\n }\n }\n }\n throw new Error(\n \"Machine user is required. Provide --machine-user or ensure tailor.config.ts has machine users configured.\",\n );\n}\n\ninterface ResolveMachineUserOptions {\n client: OperatorClient;\n workspaceId: string;\n authNamespace: string;\n machineUserName: string;\n authConfig:\n | { name: string; external?: boolean; machineUsers?: Record<string, unknown> }\n | undefined;\n}\n\n/**\n * Resolve full machine user info: name, id (from API), and attributes (from config).\n * @param options - Options for resolving machine user\n * @returns Resolved machine user with id, attributes, and attributeList\n */\nasync function resolveMachineUser(\n options: ResolveMachineUserOptions,\n): Promise<ResolvedMachineUser> {\n const { client, workspaceId, authNamespace, machineUserName, authConfig } = options;\n\n // Get machine user ID from the server\n let id = \"00000000-0000-0000-0000-000000000000\";\n try {\n const { machineUser } = await client.getAuthMachineUser({\n workspaceId,\n authNamespace,\n name: machineUserName,\n });\n if (machineUser?.id) {\n id = machineUser.id;\n }\n } catch {\n logger.debug(`Could not fetch machine user \"${machineUserName}\" from server, using nil UUID`);\n }\n\n // Get attributes from config\n const machineUserConfig = authConfig?.machineUsers?.[machineUserName];\n let attributes: Record<string, unknown> | null = null;\n let attributeList: unknown[] = [];\n if (machineUserConfig && typeof machineUserConfig === \"object\") {\n const cfg = machineUserConfig as {\n attributes?: Record<string, unknown>;\n attributeList?: unknown[];\n };\n attributes = cfg.attributes ?? null;\n attributeList = cfg.attributeList ?? [];\n }\n\n return { name: machineUserName, id, attributes, attributeList };\n}\n\n/**\n * Resolve resolver arg format: detect and unwrap deprecated {\"input\":{...}} wrapper.\n * Tries new format (arg = input fields) first via schema parse.\n * If that fails and arg looks like old format, tries unwrapping.\n * @param argStr - JSON string of the arg\n * @param inputSchema - Pre-built schema object from detect (has .parse())\n * @param machineUser - Resolved machine user info\n * @param workspaceId - Workspace ID\n * @returns Resolved JSON string (unwrapped if old format)\n */\nexport function resolveResolverArg(\n argStr: string,\n inputSchema: NonNullable<DetectedFunction[\"inputSchema\"]>,\n machineUser: ResolvedMachineUser,\n workspaceId: string,\n): string {\n const parsed = JSON.parse(argStr);\n const user = {\n id: machineUser.id,\n type: \"machine_user\" as const,\n workspaceId,\n attributes: machineUser.attributes ?? null,\n attributeList: machineUser.attributeList ?? [],\n };\n\n const newResult = inputSchema.parse({ value: parsed, data: parsed, user });\n if (!newResult.issues) {\n return argStr;\n }\n\n // New format failed — check if old format works\n if (\n Object.keys(parsed).length === 1 &&\n parsed.input != null &&\n typeof parsed.input === \"object\" &&\n !Array.isArray(parsed.input)\n ) {\n const oldResult = inputSchema.parse({ value: parsed.input, data: parsed.input, user });\n if (!oldResult.issues) {\n logger.warn(\n '[DEPRECATED] Wrapping args with \"input\" key (e.g. {\"input\":{...}}) is deprecated. Pass input fields directly (e.g. {\"a\":1}). The \"input\" wrapper will be removed in v2.',\n );\n return JSON.stringify(parsed.input);\n }\n }\n\n // Both failed — pass as-is, let server report the validation error\n return argStr;\n}\n","import { defineCommand, runCommand } from \"politty\";\nimport { getCommand } from \"./get\";\nimport { listCommand } from \"./list\";\nimport { logsCommand } from \"./logs\";\nimport { testRunCommand } from \"./test-run\";\n\nexport const functionCommand = defineCommand({\n name: \"function\",\n description: \"Manage functions\",\n subCommands: {\n get: getCommand,\n list: listCommand,\n logs: logsCommand,\n \"test-run\": testRunCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { generate } from \"@/cli/commands/generate/service\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\n\nexport const generateCommand = defineAppCommand({\n name: \"generate\",\n description: \"Generate files using Tailor configuration.\",\n args: z\n .object({\n config: arg(z.string().default(\"tailor.config.ts\"), {\n alias: \"c\",\n description: \"Path to SDK config file\",\n }),\n watch: arg(z.boolean().default(false), {\n alias: \"W\",\n description: \"Watch for type/resolver changes and regenerate\",\n }),\n })\n .strict(),\n run: async (args) => {\n const { initTelemetry } = await import(\"@/cli/telemetry\");\n await initTelemetry();\n await generate({\n configPath: args.config,\n watch: args.watch,\n });\n },\n});\n","import { spawnSync } from \"node:child_process\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { readPackageJson } from \"@/cli/shared/package-json\";\n\nconst detectPackageManager = () => {\n const availablePMs = [\"npm\", \"yarn\", \"pnpm\", \"bun\"];\n const userAgent = process.env.npm_config_user_agent;\n if (!userAgent) return;\n const [name] = userAgent.split(\"/\");\n if (!availablePMs.includes(name)) return;\n return name;\n};\n\nexport const initCommand = defineAppCommand({\n name: \"init\",\n description: \"Initialize a new project using create-sdk.\",\n args: z\n .object({\n name: arg(z.string().optional(), {\n positional: true,\n description: \"Project name\",\n }),\n template: arg(z.string().optional(), {\n alias: \"t\",\n description: \"Template name\",\n }),\n })\n .strict(),\n run: async (args) => {\n const packageJson = await readPackageJson();\n const version =\n packageJson.version && packageJson.version !== \"0.0.0\" ? packageJson.version : \"latest\";\n\n let packageManager = detectPackageManager();\n if (!packageManager) {\n logger.warn(\"Could not detect package manager, defaulting to npm\");\n packageManager = \"npm\";\n }\n const initArgs = [\n \"create\",\n `@tailor-platform/sdk@${version}`,\n ...(args.name ? [args.name] : []),\n ...(packageManager === \"npm\" ? [\"--\"] : []),\n ...(args.template ? [\"--template\", args.template] : []),\n ];\n logger.log(`Running: ${packageManager} ${initArgs.join(\" \")}`);\n\n spawnSync(packageManager, initArgs, { stdio: \"inherit\" });\n },\n});\n","import * as crypto from \"node:crypto\";\nimport * as http from \"node:http\";\nimport { generateCodeVerifier } from \"@badgateway/oauth2-client\";\nimport open from \"open\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport {\n closeConnectionPool,\n fetchPlatformMachineUserToken,\n fetchUserInfo,\n initOAuth2Client,\n} from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { readPlatformConfig, saveUserTokens, writePlatformConfig } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { prompt } from \"@/cli/shared/prompt\";\n\nconst redirectPort = 8085;\nconst redirectUri = `http://localhost:${redirectPort}/callback`;\n\nfunction randomState() {\n return crypto.randomBytes(32).toString(\"base64url\");\n}\n\nconst startAuthServer = async () => {\n const client = initOAuth2Client();\n const state = randomState();\n const codeVerifier = await generateCodeVerifier();\n\n return new Promise<void>((resolve, reject) => {\n const server = http.createServer(async (req, res) => {\n try {\n if (!req.url?.startsWith(\"/callback\")) {\n throw new Error(\"Invalid callback URL\");\n }\n const tokens = await client.authorizationCode.getTokenFromCodeRedirect(\n `http://${req.headers.host}${req.url}`,\n {\n redirectUri: redirectUri,\n state,\n codeVerifier,\n },\n );\n const userInfo = await fetchUserInfo(tokens.accessToken);\n\n const pfConfig = await readPlatformConfig();\n await saveUserTokens(\n pfConfig,\n userInfo.email,\n {\n accessToken: tokens.accessToken,\n refreshToken: tokens.refreshToken ?? undefined,\n },\n new Date(tokens.expiresAt!).toISOString(),\n );\n pfConfig.current_user = userInfo.email;\n writePlatformConfig(pfConfig);\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n status: \"ok\",\n message: \"Successfully authenticated. Please close this window.\",\n }),\n );\n resolve();\n } catch (error) {\n res.writeHead(401);\n res.end(\"Authentication failed\");\n reject(error);\n } finally {\n // Close the server after handling one request.\n server.close();\n }\n });\n\n const timeout = setTimeout(\n () => {\n server.close();\n reject(new Error(\"Login timeout exceeded\"));\n },\n 5 * 60 * 1000,\n );\n\n server.on(\"close\", () => {\n clearTimeout(timeout);\n });\n\n server.on(\"error\", (error) => {\n reject(error);\n });\n\n server.listen(redirectPort, async () => {\n const authorizeUri = await client.authorizationCode.getAuthorizeUri({\n redirectUri,\n state,\n codeVerifier,\n });\n\n logger.info(`Opening browser for login:\\n\\n${authorizeUri}\\n`);\n try {\n await open(authorizeUri);\n } catch {\n logger.warn(\"Failed to open browser automatically. Please open the URL above manually.\");\n }\n });\n });\n};\n\nasync function loginAsMachineUser(args: { clientId: string; clientSecret?: string }) {\n const clientSecret = args.clientSecret ?? (await prompt.password({ message: \"Client secret\" }));\n const tokens = await fetchPlatformMachineUserToken(args.clientId, clientSecret);\n\n const pfConfig = await readPlatformConfig();\n await saveUserTokens(\n pfConfig,\n args.clientId,\n { accessToken: tokens.accessToken },\n new Date(tokens.expiresAt!).toISOString(),\n );\n pfConfig.current_user = args.clientId;\n writePlatformConfig(pfConfig);\n}\n\nexport const loginCommand = defineAppCommand({\n name: \"login\",\n description: \"Login to Tailor Platform.\",\n args: z.xor([\n z.object({}).strict().describe(\"User Login\"),\n z\n .object({\n \"machine-user\": arg(z.literal(true), {\n hiddenAlias: \"machineuser\",\n description: \"Login as a platform machine user.\",\n required: true,\n }),\n \"client-id\": arg(z.string(), {\n description: \"Client ID\",\n env: \"TAILOR_PLATFORM_MACHINE_USER_CLIENT_ID\",\n required: true,\n }),\n \"client-secret\": arg(z.string().optional(), {\n description: \"Client secret\",\n env: \"TAILOR_PLATFORM_MACHINE_USER_CLIENT_SECRET\",\n }),\n })\n .strict()\n .describe(\"Machine User Login\"),\n ]),\n run: async (args) => {\n if (\"machine-user\" in args && args[\"machine-user\"]) {\n await loginAsMachineUser({\n clientId: args.clientId,\n clientSecret: args.clientSecret,\n });\n } else {\n await startAuthServer();\n }\n logger.success(\"Successfully logged in to Tailor Platform.\");\n await closeConnectionPool();\n },\n});\n","import { z } from \"zod\";\nimport { initOAuth2Client } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport {\n deleteUserTokens,\n readPlatformConfig,\n resolveTokens,\n writePlatformConfig,\n} from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\n\nexport const logoutCommand = defineAppCommand({\n name: \"logout\",\n description: \"Logout from Tailor Platform.\",\n args: z.object({}).strict(),\n run: async () => {\n const pfConfig = await readPlatformConfig();\n const userEntry = pfConfig.current_user ? pfConfig.users[pfConfig.current_user] : undefined;\n if (!userEntry) {\n logger.info(\"You are not logged in.\");\n return;\n }\n\n try {\n const { accessToken, refreshToken } = await resolveTokens(userEntry, pfConfig.current_user!);\n const client = initOAuth2Client();\n const tokenTypeHint = refreshToken ? \"refresh_token\" : \"access_token\";\n await client.revoke(\n {\n accessToken,\n refreshToken: refreshToken ?? null,\n expiresAt: Date.parse(userEntry.token_expires_at),\n },\n tokenTypeHint,\n );\n } catch (error) {\n logger.warn(`Failed to revoke token: ${error instanceof Error ? error.message : error}`);\n }\n\n await deleteUserTokens(pfConfig, pfConfig.current_user!);\n delete pfConfig.users[pfConfig.current_user!];\n pfConfig.current_user = null;\n writePlatformConfig(pfConfig);\n logger.success(\"Successfully logged out from Tailor Platform.\");\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { listCommand } from \"./list\";\nimport { tokenCommand } from \"./token\";\n\nexport const machineuserCommand = defineCommand({\n name: \"machineuser\",\n description: \"Manage machine users in your Tailor Platform application.\",\n subCommands: {\n list: listCommand,\n token: tokenCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { getCommand } from \"./get\";\nimport { listCommand } from \"./list\";\n\nexport const oauth2clientCommand = defineCommand({\n name: \"oauth2client\",\n description: \"Manage OAuth2 clients in your Tailor Platform application.\",\n subCommands: {\n list: listCommand,\n get: getCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import open from \"open\";\nimport { z } from \"zod\";\nimport { deploymentArgs } from \"@/cli/shared/args\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadConfig } from \"@/cli/shared/config-loader\";\nimport { loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\n\nconst consoleBaseUrl = \"https://console.tailor.tech\";\n\nexport const openCommand = defineAppCommand({\n name: \"open\",\n description: \"Open Tailor Platform Console.\",\n args: z\n .object({\n ...deploymentArgs,\n })\n .strict(),\n run: async (args) => {\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n const { config } = await loadConfig(args.config);\n const applicationName = config.name;\n const consolePath = `/workspaces/${workspaceId}/applications/${encodeURIComponent(applicationName)}/overview`;\n const consoleUrl = new URL(consolePath, consoleBaseUrl).toString();\n const jsonOutput = logger.jsonMode;\n\n logger.info(\"Opening Tailor Platform Console...\");\n\n let opened = true;\n try {\n await open(consoleUrl);\n } catch {\n opened = false;\n }\n\n if (jsonOutput) {\n logger.out({ consoleUrl, workspaceId, applicationName, opened });\n return;\n }\n\n if (opened) {\n logger.out(`Console URL: ${consoleUrl}`);\n logger.out(`Workspace ID: ${workspaceId}`);\n logger.out(`Application Name: ${applicationName}`);\n } else {\n logger.warn(\n `Failed to open browser automatically. Please open this URL manually:\\n${consoleUrl}`,\n );\n }\n },\n});\n","import { defineCommand } from \"politty\";\nimport { createCommand } from \"./create\";\nimport { deleteCommand } from \"./delete\";\nimport { getCommand } from \"./get\";\nimport { listCommand } from \"./list\";\nimport { updateCommand } from \"./update\";\n\nexport const folderCommand = defineCommand({\n name: \"folder\",\n description: \"Manage organization folders.\",\n subCommands: {\n create: createCommand,\n delete: deleteCommand,\n get: getCommand,\n list: listCommand,\n update: updateCommand,\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { folderCommand } from \"./folder\";\nimport { getCommand } from \"./get\";\nimport { listCommand } from \"./list\";\nimport { treeCommand } from \"./tree\";\nimport { updateCommand } from \"./update\";\n\nexport const organizationCommand = defineCommand({\n name: \"organization\",\n description: \"Manage Tailor Platform organizations.\",\n subCommands: {\n folder: folderCommand,\n get: getCommand,\n list: listCommand,\n tree: treeCommand,\n update: updateCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { fetchAll, initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { fetchLatestToken, readPlatformConfig, writePlatformConfig } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport type { ProfileInfo } from \"./types\";\n\nexport const createCommand = defineAppCommand({\n name: \"create\",\n description: \"Create a new profile.\",\n args: z\n .object({\n name: arg(z.string(), {\n positional: true,\n description: \"Profile name\",\n }),\n user: arg(z.string(), {\n alias: \"u\",\n description: \"User email\",\n }),\n \"workspace-id\": arg(z.string(), {\n alias: \"w\",\n description: \"Workspace ID\",\n }),\n permission: arg(z.enum([\"write\", \"read\"]).default(\"write\"), {\n description:\n \"Profile permission. 'read' blocks all write commands while the profile is active.\",\n }),\n })\n .strict(),\n run: async (args) => {\n const config = await readPlatformConfig();\n\n // Check if profile already exists\n if (config.profiles[args.name]) {\n throw new Error(`Profile \"${args.name}\" already exists.`);\n }\n\n // Check if user exists\n const token = await fetchLatestToken(config, args.user);\n\n // Check if workspace exists\n const client = await initOperatorClient(token);\n const workspaces = await fetchAll(async (pageToken, maxPageSize) => {\n const { workspaces, nextPageToken } = await client.listWorkspaces({\n pageToken,\n pageSize: maxPageSize,\n });\n return [workspaces, nextPageToken];\n });\n\n const workspace = workspaces.find((ws) => ws.id === args[\"workspace-id\"]);\n if (!workspace) {\n throw new Error(`Workspace \"${args[\"workspace-id\"]}\" not found.`);\n }\n\n // Create new profile\n config.profiles[args.name] = {\n user: args.user,\n workspace_id: args[\"workspace-id\"],\n ...(args.permission === \"read\" ? { readonly: true } : {}),\n };\n writePlatformConfig(config);\n\n if (!args.json) {\n logger.success(`Profile \"${args.name}\" created successfully.`);\n }\n\n // Show profile info\n const profileInfo: ProfileInfo = {\n name: args.name,\n user: args.user,\n workspaceId: args[\"workspace-id\"],\n permission: args.permission,\n };\n logger.out(profileInfo);\n },\n});\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { readPlatformConfig, writePlatformConfig } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\n\nexport const deleteCommand = defineAppCommand({\n name: \"delete\",\n description: \"Delete a profile.\",\n args: z\n .object({\n name: arg(z.string(), {\n positional: true,\n description: \"Profile name\",\n }),\n })\n .strict(),\n run: async (args) => {\n const config = await readPlatformConfig();\n\n // Check if profile exists\n if (!config.profiles[args.name]) {\n throw new Error(`Profile \"${args.name}\" not found.`);\n }\n\n // Delete profile\n delete config.profiles[args.name];\n writePlatformConfig(config);\n\n logger.success(`Profile \"${args.name}\" deleted successfully.`);\n },\n});\n","import { z } from \"zod\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { readPlatformConfig } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport ml from \"@/utils/multiline\";\nimport type { ProfileInfo } from \"./types\";\n\nexport const listCommand = defineAppCommand({\n name: \"list\",\n description: \"List all profiles.\",\n args: z.object({}).strict(),\n run: async () => {\n const config = await readPlatformConfig();\n const jsonOutput = logger.jsonMode;\n\n const profiles = Object.entries(config.profiles);\n if (profiles.length === 0) {\n logger.info(ml`\n No profiles found.\n Please create a profile first using 'tailor-sdk profile create' command.\n `);\n if (jsonOutput) {\n logger.out([]);\n }\n return;\n }\n\n const profileInfos: ProfileInfo[] = profiles.map(([name, profile]) => ({\n name,\n user: profile!.user,\n workspaceId: profile!.workspace_id,\n permission: profile!.readonly === true ? \"read\" : \"write\",\n }));\n logger.out(profileInfos);\n },\n});\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { fetchAll, initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { fetchLatestToken, readPlatformConfig, writePlatformConfig } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport type { ProfileInfo } from \"./types\";\n\nexport const updateCommand = defineAppCommand({\n name: \"update\",\n description: \"Update profile properties.\",\n args: z\n .object({\n name: arg(z.string(), {\n positional: true,\n description: \"Profile name\",\n }),\n user: arg(z.string().optional(), {\n alias: \"u\",\n description: \"New user email\",\n }),\n \"workspace-id\": arg(z.string().optional(), {\n alias: \"w\",\n description: \"New workspace ID\",\n }),\n permission: arg(z.enum([\"write\", \"read\"]).optional(), {\n description:\n \"Profile permission. 'read' blocks all write commands; 'write' lifts the restriction.\",\n }),\n })\n .strict(),\n run: async (args) => {\n const config = await readPlatformConfig();\n\n // Check if profile exists\n if (!config.profiles[args.name]) {\n throw new Error(`Profile \"${args.name}\" not found.`);\n }\n\n // Check if at least one property is provided\n if (!args.user && !args[\"workspace-id\"] && args.permission === undefined) {\n throw new Error(\"Please provide at least one property to update.\");\n }\n\n const profile = config.profiles[args.name]!;\n const oldUser = profile.user;\n const newUser = args.user || oldUser;\n const oldWorkspaceId = profile.workspace_id;\n const newWorkspaceId = args[\"workspace-id\"] || oldWorkspaceId;\n\n // Skip remote validation when neither user nor workspace is changing.\n // This keeps `profile update <name> --permission write|read` working\n // offline and when the saved token is expired or the workspace has been\n // removed, important so a user can always lift their own readonly flag.\n if (args.user !== undefined || args[\"workspace-id\"] !== undefined) {\n // Check if user exists\n const token = await fetchLatestToken(config, newUser);\n\n // Check if workspace exists\n const client = await initOperatorClient(token);\n const workspaces = await fetchAll(async (pageToken, maxPageSize) => {\n const { workspaces, nextPageToken } = await client.listWorkspaces({\n pageToken,\n pageSize: maxPageSize,\n });\n return [workspaces, nextPageToken];\n });\n const workspace = workspaces.find((ws) => ws.id === newWorkspaceId);\n if (!workspace) {\n throw new Error(`Workspace \"${newWorkspaceId}\" not found.`);\n }\n }\n\n // Update properties\n profile.user = newUser;\n profile.workspace_id = newWorkspaceId;\n if (args.permission === \"read\") {\n profile.readonly = true;\n } else if (args.permission === \"write\") {\n delete profile.readonly;\n }\n writePlatformConfig(config);\n if (!args.json) {\n logger.success(`Profile \"${args.name}\" updated successfully`);\n }\n\n // Show profile info\n const profileInfo: ProfileInfo = {\n name: args.name,\n user: newUser,\n workspaceId: newWorkspaceId,\n permission: profile.readonly === true ? \"read\" : \"write\",\n };\n logger.out(profileInfo);\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { createCommand } from \"./create\";\nimport { deleteCommand } from \"./delete\";\nimport { listCommand } from \"./list\";\nimport { updateCommand } from \"./update\";\n\nexport type { ProfileInfo } from \"./types\";\n\nexport const profileCommand = defineCommand({\n name: \"profile\",\n description: \"Manage workspace profiles (user + workspace combinations).\",\n subCommands: {\n create: createCommand,\n delete: deleteCommand,\n list: listCommand,\n update: updateCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\n\n/**\n * Arguments for specify secret key\n */\nexport const vaultArgs = {\n \"vault-name\": arg(z.string(), {\n alias: \"V\",\n description: \"Vault name\",\n }),\n};\n\n/**\n * Arguments for specify secret key\n */\nexport const secretIdentifyArgs = {\n ...vaultArgs,\n name: arg(z.string(), {\n alias: \"n\",\n description: \"Secret name\",\n }),\n};\n\n/**\n * Arguments for specify secret key\n */\nexport const secretValueArgs = {\n ...secretIdentifyArgs,\n value: arg(z.string(), {\n alias: \"v\",\n description: \"Secret value\",\n }),\n};\n","import { resourceTrn, sdkNameLabelKey } from \"@/cli/commands/deploy/label\";\nimport { logger } from \"@/cli/shared/logger\";\nimport type { OperatorClient } from \"@/cli/shared/client\";\n\ntype CheckVaultManagedParams = {\n client: OperatorClient;\n workspaceId: string;\n vaultName: string;\n};\n\ntype CheckVaultManagedResult = {\n isManaged: boolean;\n trn: string;\n existingLabels: Record<string, string>;\n};\n\n/**\n * Check if a vault is managed by defineSecretManager() and warn the user.\n * Returns management status and metadata needed for releasing ownership.\n * @param params - Check parameters\n * @returns Management status, TRN, and existing labels\n */\nexport async function checkVaultManaged(\n params: CheckVaultManagedParams,\n): Promise<CheckVaultManagedResult> {\n const { client, workspaceId, vaultName } = params;\n const trn = resourceTrn(workspaceId, \"vault\", vaultName);\n const notManaged = { isManaged: false, trn, existingLabels: {} };\n\n let owner: string | undefined;\n let allLabels: Record<string, string>;\n try {\n const { metadata } = await client.getMetadata({ trn });\n allLabels = metadata?.labels ?? {};\n owner = allLabels[sdkNameLabelKey];\n } catch {\n // If metadata fetch fails (e.g., vault doesn't exist yet), proceed silently.\n // The actual operation will surface the appropriate error.\n return notManaged;\n }\n\n if (!owner) return notManaged;\n\n logger.warn(\n `Vault \"${vaultName}\" is managed by defineSecretManager() in tailor.config.ts (owner: \"${owner}\"). ` +\n `Changes made via CLI may conflict with the config on the next apply.`,\n );\n\n return { isManaged: true, trn, existingLabels: allLabels };\n}\n\n/**\n * Release ownership of a managed vault by removing SDK labels from metadata.\n * Call this after the user has confirmed they want to proceed with a CLI operation on a managed vault.\n * @param params - Client, TRN, and existing labels from checkVaultManaged result\n * @param params.client - Operator client used to update vault metadata\n * @param params.trn - TRN of the vault resource\n * @param params.existingLabels - Existing metadata labels on the vault before release\n */\nexport async function releaseVaultOwnership(params: {\n client: OperatorClient;\n trn: string;\n existingLabels: Record<string, string>;\n}): Promise<void> {\n const { client, trn, existingLabels } = params;\n const { [sdkNameLabelKey]: _, \"sdk-version\": __, ...remainingLabels } = existingLabels;\n await client.setMetadata({ trn, labels: remainingLabels });\n logger.info(\n \"Config ownership has been removed from this vault. \" +\n \"Remove it from defineSecretManager() in your config to prevent the next apply from re-claiming it.\",\n );\n}\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { z } from \"zod\";\nimport { confirmationArgs, workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { prompt } from \"@/cli/shared/prompt\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport { secretValueArgs } from \"./args\";\nimport { checkVaultManaged, releaseVaultOwnership } from \"./check-vault-managed\";\n\nexport const createSecretCommand = defineAppCommand({\n name: \"create\",\n description: \"Create a secret in a vault.\",\n args: z\n .object({\n ...workspaceArgs,\n ...secretValueArgs,\n ...confirmationArgs,\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n const managed = await checkVaultManaged({\n client,\n workspaceId,\n vaultName: args[\"vault-name\"],\n });\n if (managed.isManaged && !args.yes) {\n const confirmed = await prompt.confirm({\n message: \"Do you want to proceed?\",\n default: false,\n });\n if (!confirmed) return;\n }\n try {\n await client.createSecretManagerSecret({\n workspaceId,\n secretmanagerVaultName: args[\"vault-name\"],\n secretmanagerSecretName: args.name,\n secretmanagerSecretValue: args.value,\n });\n } catch (error) {\n if (error instanceof ConnectError) {\n if (error.code === Code.NotFound) {\n throw new Error(`Vault \"${args[\"vault-name\"]}\" not found.`, { cause: error });\n }\n if (error.code === Code.AlreadyExists) {\n throw new Error(`Secret \"${args.name}\" already exists.`, { cause: error });\n }\n }\n throw error;\n }\n\n if (managed.isManaged) {\n await releaseVaultOwnership({ client, ...managed });\n }\n\n logger.success(`Secret: ${args.name} created in vault: ${args[\"vault-name\"]}`);\n },\n});\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { z } from \"zod\";\nimport { confirmationArgs, workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { prompt } from \"@/cli/shared/prompt\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport { secretIdentifyArgs } from \"./args\";\nimport { checkVaultManaged, releaseVaultOwnership } from \"./check-vault-managed\";\n\nexport const deleteSecretCommand = defineAppCommand({\n name: \"delete\",\n description: \"Delete a secret in a vault.\",\n args: z\n .object({\n ...workspaceArgs,\n ...secretIdentifyArgs,\n ...confirmationArgs,\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n // No additional confirmation for managed vaults — the name-typing confirmation below is a stronger guard.\n const managed = await checkVaultManaged({ client, workspaceId, vaultName: args[\"vault-name\"] });\n\n if (!args.yes) {\n const confirmation = await prompt.text({\n message: `Enter the secret name to confirm deletion (\"${args.name}\"):`,\n });\n\n if (confirmation !== args.name) {\n logger.info(\"Secret deletion cancelled.\");\n return;\n }\n }\n\n try {\n await client.deleteSecretManagerSecret({\n workspaceId,\n secretmanagerVaultName: args[\"vault-name\"],\n secretmanagerSecretName: args.name,\n });\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(`Secret \"${args.name}\" not found in vault \"${args[\"vault-name\"]}\".`, {\n cause: error,\n });\n }\n throw error;\n }\n\n if (managed.isManaged) {\n await releaseVaultOwnership({ client, ...managed });\n }\n\n logger.success(`Secret: ${args.name} deleted from vault: ${args[\"vault-name\"]}`);\n },\n});\n","import { timestampDate } from \"@bufbuild/protobuf/wkt\";\nimport { Code, ConnectError } from \"@connectrpc/connect\";\nimport { z } from \"zod\";\nimport { type Order, paginationArgs, toPageDirection, workspaceArgs } from \"@/cli/shared/args\";\nimport { fetchPaged, initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { vaultArgs } from \"./args\";\nimport type { SecretManagerSecret } from \"@tailor-proto/tailor/v1/secret_manager_resource_pb\";\n\nexport interface SecretListOptions {\n workspaceId?: string;\n profile?: string;\n vaultName: string;\n order?: Order;\n limit?: number;\n}\n\nexport interface SecretInfo {\n name: string;\n createdAt: Date | null;\n updatedAt: Date | null;\n}\n\nfunction secretInfo(secret: SecretManagerSecret): SecretInfo {\n return {\n name: secret.name,\n createdAt: secret.createTime ? timestampDate(secret.createTime) : null,\n updatedAt: secret.updateTime ? timestampDate(secret.updateTime) : null,\n };\n}\n\n/**\n * List secrets in a Secret Manager vault.\n * @param options - Secret listing options\n * @returns List of secrets\n */\nasync function secretList(options: SecretListOptions): Promise<SecretInfo[]> {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: options.workspaceId,\n profile: options.profile,\n });\n\n const pageDirection = toPageDirection(options.order);\n const secrets = await fetchPaged(\n async (pageToken, pageSize) => {\n const { secrets, nextPageToken } = await client.listSecretManagerSecrets({\n workspaceId,\n secretmanagerVaultName: options.vaultName,\n pageToken,\n pageSize,\n pageDirection,\n });\n return [secrets, nextPageToken];\n },\n { limit: options.limit },\n );\n\n return secrets.map(secretInfo);\n}\n\nexport const listSecretCommand = defineAppCommand({\n name: \"list\",\n description: \"List all secrets in a vault.\",\n args: z\n .object({\n ...workspaceArgs,\n ...vaultArgs,\n ...paginationArgs(),\n })\n .strict(),\n run: async (args) => {\n try {\n const secrets = await secretList({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n vaultName: args[\"vault-name\"],\n order: args.order,\n limit: args.limit,\n });\n logger.out(secrets);\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(`Vault \"${args[\"vault-name\"]}\" not found.`, { cause: error });\n }\n throw error;\n }\n },\n});\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { z } from \"zod\";\nimport { confirmationArgs, workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { prompt } from \"@/cli/shared/prompt\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport { secretValueArgs } from \"./args\";\nimport { checkVaultManaged, releaseVaultOwnership } from \"./check-vault-managed\";\n\nexport const updateSecretCommand = defineAppCommand({\n name: \"update\",\n description: \"Update a secret in a vault.\",\n args: z\n .object({\n ...workspaceArgs,\n ...secretValueArgs,\n ...confirmationArgs,\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n const managed = await checkVaultManaged({\n client,\n workspaceId,\n vaultName: args[\"vault-name\"],\n });\n if (managed.isManaged && !args.yes) {\n const confirmed = await prompt.confirm({\n message: \"Do you want to proceed?\",\n default: false,\n });\n if (!confirmed) return;\n }\n try {\n await client.updateSecretManagerSecret({\n workspaceId,\n secretmanagerVaultName: args[\"vault-name\"],\n secretmanagerSecretName: args.name,\n secretmanagerSecretValue: args.value,\n });\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(`Secret \"${args.name}\" not found in vault \"${args[\"vault-name\"]}\".`, {\n cause: error,\n });\n }\n throw error;\n }\n\n if (managed.isManaged) {\n await releaseVaultOwnership({ client, ...managed });\n }\n\n logger.success(`Secret: ${args.name} updated in vault: ${args[\"vault-name\"]}`);\n },\n});\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\n\ntype ArgsShape = Record<string, z.ZodType>;\n\nexport const nameArgs = {\n name: arg(z.string(), {\n positional: true,\n description: \"Vault name\",\n }),\n} satisfies ArgsShape;\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { z } from \"zod\";\nimport { workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport { nameArgs } from \"./args\";\n\nexport const createCommand = defineAppCommand({\n name: \"create\",\n description: \"Create a new Secret Manager vault.\",\n args: z\n .object({\n ...workspaceArgs,\n ...nameArgs,\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n try {\n await client.createSecretManagerVault({\n workspaceId,\n secretmanagerVaultName: args.name,\n });\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.AlreadyExists) {\n throw new Error(`Vault \"${args.name}\" already exists.`, { cause: error });\n }\n throw error;\n }\n\n logger.success(`Vault: ${args.name} created`);\n },\n});\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { z } from \"zod\";\nimport { confirmationArgs, workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { prompt } from \"@/cli/shared/prompt\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport { checkVaultManaged } from \"../check-vault-managed\";\nimport { nameArgs } from \"./args\";\n\nexport const deleteCommand = defineAppCommand({\n name: \"delete\",\n description: \"Delete a Secret Manager vault.\",\n args: z\n .object({\n ...workspaceArgs,\n ...nameArgs,\n ...confirmationArgs,\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n // No additional confirmation for managed vaults — the name-typing confirmation below is a stronger guard.\n const managed = await checkVaultManaged({ client, workspaceId, vaultName: args.name });\n\n if (!args.yes) {\n const confirmation = await prompt.text({\n message: `Enter the vault name to confirm deletion (\"${args.name}\"):`,\n });\n if (confirmation !== args.name) {\n logger.info(\"Vault deletion cancelled.\");\n return;\n }\n }\n\n try {\n await client.deleteSecretManagerVault({\n workspaceId,\n secretmanagerVaultName: args.name,\n });\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(`Vault \"${args.name}\" not found.`, { cause: error });\n }\n throw error;\n }\n\n if (managed.isManaged) {\n logger.info(\n \"Remove this vault from defineSecretManager() in your config to prevent the next apply from re-creating it.\",\n );\n }\n\n logger.success(`Vault: ${args.name} deleted`);\n },\n});\n","import { timestampDate } from \"@bufbuild/protobuf/wkt\";\nimport { z } from \"zod\";\nimport { type Order, paginationArgs, toPageDirection, workspaceArgs } from \"@/cli/shared/args\";\nimport { fetchPaged, initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport type { SecretManagerVault } from \"@tailor-proto/tailor/v1/secret_manager_resource_pb\";\n\nexport interface VaultListOptions {\n workspaceId?: string;\n profile?: string;\n order?: Order;\n limit?: number;\n}\n\nexport interface VaultInfo {\n name: string;\n createdAt: Date | null;\n updatedAt: Date | null;\n}\n\nfunction vaultInfo(vault: SecretManagerVault): VaultInfo {\n return {\n name: vault.name,\n createdAt: vault.createTime ? timestampDate(vault.createTime) : null,\n updatedAt: vault.updateTime ? timestampDate(vault.updateTime) : null,\n };\n}\n\n/**\n * List Secret Manager vaults in the workspace.\n * @param options - Vault listing options\n * @returns List of vaults\n */\nasync function vaultList(options?: VaultListOptions): Promise<VaultInfo[]> {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options?.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: options?.workspaceId,\n profile: options?.profile,\n });\n\n const pageDirection = toPageDirection(options?.order);\n const vaults = await fetchPaged(\n async (pageToken, pageSize) => {\n const { vaults, nextPageToken } = await client.listSecretManagerVaults({\n workspaceId,\n pageToken,\n pageSize,\n pageDirection,\n });\n return [vaults, nextPageToken];\n },\n { limit: options?.limit },\n );\n\n return vaults.map(vaultInfo);\n}\n\nexport const listCommand = defineAppCommand({\n name: \"list\",\n description: \"List all Secret Manager vaults in the workspace.\",\n args: z\n .object({\n ...workspaceArgs,\n ...paginationArgs(),\n })\n .strict(),\n run: async (args) => {\n const vaults = await vaultList({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n order: args.order,\n limit: args.limit,\n });\n\n logger.out(vaults);\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { createCommand } from \"./create\";\nimport { deleteCommand } from \"./delete\";\nimport { listCommand } from \"./list\";\n\nexport const vaultCommand = defineCommand({\n name: \"vault\",\n description: \"Manage Secret Manager vaults.\",\n subCommands: {\n create: createCommand,\n delete: deleteCommand,\n list: listCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { createSecretCommand } from \"./create\";\nimport { deleteSecretCommand } from \"./delete\";\nimport { listSecretCommand } from \"./list\";\nimport { updateSecretCommand } from \"./update\";\nimport { vaultCommand } from \"./vault\";\n\nexport const secretCommand = defineCommand({\n name: \"secret\",\n description: \"Manage Secret Manager vaults and secrets.\",\n subCommands: {\n vault: vaultCommand,\n create: createSecretCommand,\n update: updateSecretCommand,\n list: listSecretCommand,\n delete: deleteSecretCommand,\n },\n async run() {\n await runCommand(vaultCommand, []);\n },\n});\n","export default \"name: Tailor Platform\\n\\non:\\n pull_request:\\n branches:\\n - main\\n push:\\n branches:\\n - main\\n workflow_dispatch:\\n\\nconcurrency:\\n group: tailor-__WORKSPACE_NAME__-${{ github.head_ref || github.ref }}\\n cancel-in-progress: ${{ github.event_name == 'pull_request' }}\\n\\njobs:\\n # __PLAN_JOB_START__\\n plan:\\n if: github.event_name == 'pull_request'\\n runs-on: ubuntu-latest\\n permissions:\\n contents: read\\n pull-requests: write\\n steps:\\n - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3\\n with:\\n fetch-depth: 0\\n # __SETUP_STEPS__\\n - uses: tailor-platform/actions/plan@e63ed98630a23fa21ee0636abf0f7fb75fcdce40 # v1.1.0\\n with:\\n workspace-id: ${{ vars.TAILOR_PLATFORM_WORKSPACE_ID }}\\n # __WORKING_DIRECTORY__\\n platform-client-id: ${{ secrets.PLATFORM_MACHINE_USER_CLIENT_ID }}\\n platform-client-secret: ${{ secrets.PLATFORM_MACHINE_USER_CLIENT_SECRET }}\\n github-token: ${{ secrets.GITHUB_TOKEN }}\\n # __PLAN_JOB_END__\\n deploy:\\n if: github.event_name != 'pull_request'\\n runs-on: ubuntu-latest\\n permissions:\\n contents: read\\n steps:\\n - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3\\n # __SETUP_STEPS__\\n - uses: tailor-platform/actions/deploy@e63ed98630a23fa21ee0636abf0f7fb75fcdce40 # v1.1.0\\n with:\\n workspace-name: __WORKSPACE_NAME__\\n workspace-region: __WORKSPACE_REGION__\\n organization-id: __ORGANIZATION_ID__\\n folder-id: __FOLDER_ID__\\n # __WORKING_DIRECTORY__\\n platform-client-id: ${{ secrets.PLATFORM_MACHINE_USER_CLIENT_ID }}\\n platform-client-secret: ${{ secrets.PLATFORM_MACHINE_USER_CLIENT_SECRET }}\\n\";","export default \"- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0\\n- run: bun install --frozen-lockfile\\n\";","export default \"- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0\\n with:\\n node-version-file: package.json\\n cache: npm\\n- run: npm ci\\n\";","export default \"- uses: pnpm/action-setup@0e279bb959325dab635dd2c09392533439d90093 # v6.0.8\\n- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0\\n with:\\n node-version-file: package.json\\n cache: pnpm\\n- run: pnpm install --frozen-lockfile\\n\";","export default \"- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0\\n with:\\n node-version-file: package.json\\n cache: yarn\\n- run: yarn install --frozen-lockfile\\n\";","import * as fs from \"node:fs\";\nimport * as path from \"pathe\";\nimport deployTemplate from \"./deploy.workflow.yml\";\nimport setupBun from \"./setup-bun.yml\";\nimport setupNpm from \"./setup-npm.yml\";\nimport setupPnpm from \"./setup-pnpm.yml\";\nimport setupYarn from \"./setup-yarn.yml\";\n\ntype PackageManager = \"pnpm\" | \"yarn\" | \"npm\" | \"bun\";\n\ntype DeployParams = {\n workspaceName: string;\n workspaceRegion: string;\n organizationId: string;\n folderId: string;\n workingDirectory?: string;\n packageManager: PackageManager;\n withPlan?: boolean;\n};\n\nconst setupSteps: Record<PackageManager, string> = {\n pnpm: setupPnpm,\n yarn: setupYarn,\n npm: setupNpm,\n bun: setupBun,\n};\n\nfunction indentSnippet(snippet: string, spaces: number): string {\n const indent = \" \".repeat(spaces);\n return snippet\n .trimEnd()\n .split(\"\\n\")\n .map((line) => (line ? indent + line : line))\n .join(\"\\n\");\n}\n\n/**\n * Detect the package manager used in a project directory by checking for lockfiles.\n * @param dir - Project directory to inspect\n * @returns Detected package manager, defaults to npm\n */\nexport function detectPackageManager(dir: string): PackageManager {\n if (fs.existsSync(path.join(dir, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (fs.existsSync(path.join(dir, \"yarn.lock\"))) return \"yarn\";\n if (fs.existsSync(path.join(dir, \"bun.lockb\")) || fs.existsSync(path.join(dir, \"bun.lock\")))\n return \"bun\";\n if (fs.existsSync(path.join(dir, \"package-lock.json\"))) return \"npm\";\n return \"npm\";\n}\n\n/**\n * Render the deploy workflow YAML.\n *\n * Generates a workflow that calls the composite deploy action\n * from tailor-platform/actions. The environment setup steps (Node.js,\n * package manager, dependency install) are generated based on the\n * detected package manager.\n *\n * If withPlan is true, also includes a plan job that runs on pull requests.\n * Otherwise, the plan job section delimited by __PLAN_JOB_START__ /\n * __PLAN_JOB_END__ markers is stripped from the template.\n * @param params - Workspace and deployment configuration\n * @returns Workflow YAML content\n */\nexport function renderDeploy(params: DeployParams): string {\n const {\n workspaceName,\n workspaceRegion,\n organizationId,\n folderId,\n workingDirectory,\n packageManager,\n withPlan,\n } = params;\n\n const workingDirectoryLine = workingDirectory\n ? ` working-directory: ${workingDirectory}\\n`\n : \"\";\n\n const stripPlanSection = (content: string): string =>\n withPlan\n ? content.replace(/^ *# __PLAN_JOB_(?:START|END)__\\n/gm, \"\")\n : content.replace(/^ *# __PLAN_JOB_START__\\n[\\s\\S]*?^ *# __PLAN_JOB_END__\\n/m, \"\");\n\n return stripPlanSection(deployTemplate)\n .replaceAll(\"__WORKSPACE_NAME__\", () => workspaceName)\n .replaceAll(\"__WORKSPACE_REGION__\", () => workspaceRegion)\n .replaceAll(\"__ORGANIZATION_ID__\", () => organizationId)\n .replaceAll(\"__FOLDER_ID__\", () => folderId)\n .replace(/ *# __WORKING_DIRECTORY__\\n/g, () => workingDirectoryLine)\n .replace(/^ *# __SETUP_STEPS__$/gm, () => indentSnippet(setupSteps[packageManager], 6));\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"pathe\";\nimport { logBetaWarning } from \"@/cli/shared/beta\";\nimport { logger, styles } from \"@/cli/shared/logger\";\nimport { detectPackageManager, renderDeploy } from \"./templates\";\n\nexport type SetupGitHubOptions = {\n workspaceName: string;\n workspaceRegion: string;\n organizationId: string;\n folderId: string;\n dir: string;\n outputDir: string;\n withPlan?: boolean;\n};\n\ntype GeneratedFile = {\n path: string;\n content: string;\n};\n\ntype WriteResult = {\n written: string[];\n skipped: string[];\n};\n\n/**\n * Build the list of GitHub Actions files to generate.\n * @param options - Setup options including workspace config and output directory\n * @returns Array of files with paths and rendered content\n */\nexport function buildFiles(options: SetupGitHubOptions): GeneratedFile[] {\n const githubDir = path.join(options.outputDir, \".github\");\n const packageManager = detectPackageManager(options.outputDir);\n const workingDirectory = options.dir !== \".\" ? options.dir : undefined;\n\n return [\n {\n path: path.join(githubDir, `workflows/tailor-${options.workspaceName}.yml`),\n content: renderDeploy({\n workspaceName: options.workspaceName,\n workspaceRegion: options.workspaceRegion,\n organizationId: options.organizationId,\n folderId: options.folderId,\n workingDirectory,\n packageManager,\n withPlan: options.withPlan,\n }),\n },\n ];\n}\n\n/**\n * Write files to disk, skipping any that already exist.\n * @param files - Files to write\n * @returns Result with lists of written and skipped file paths\n */\nexport function writeFiles(files: GeneratedFile[]): WriteResult {\n const written: string[] = [];\n const skipped: string[] = [];\n\n for (const file of files) {\n if (fs.existsSync(file.path)) {\n skipped.push(file.path);\n continue;\n }\n fs.mkdirSync(path.dirname(file.path), { recursive: true });\n fs.writeFileSync(file.path, file.content);\n written.push(file.path);\n }\n\n return { written, skipped };\n}\n\n/**\n * Generate GitHub Actions workflow files and print next steps.\n * @param options - Setup options including workspace config and output directory\n */\nexport function setupGitHub(options: SetupGitHubOptions): void {\n logBetaWarning(\"setup github\");\n\n const files = buildFiles(options);\n const result = writeFiles(files);\n\n for (const filePath of result.written) {\n const relativePath = path.relative(options.outputDir, filePath);\n logger.success(`Generated ${styles.path(relativePath)}`);\n }\n\n for (const filePath of result.skipped) {\n const relativePath = path.relative(options.outputDir, filePath);\n logger.warn(`Skipped ${styles.path(relativePath)} (already exists)`);\n }\n\n logger.newline();\n logger.info(\"Next steps - set GitHub secrets:\");\n logger.log(` gh secret set PLATFORM_MACHINE_USER_CLIENT_ID`);\n logger.log(` gh secret set PLATFORM_MACHINE_USER_CLIENT_SECRET`);\n\n if (options.withPlan) {\n logger.newline();\n logger.info(\"For plan job - set GitHub variable with your workspace ID:\");\n logger.log(` gh variable set TAILOR_PLATFORM_WORKSPACE_ID`);\n }\n}\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { setupGitHub } from \"./github\";\n\nexport const githubCommand = defineAppCommand({\n name: \"github\",\n description: \"Generate GitHub Actions workflow for deployment. (beta)\",\n args: z\n .object({\n \"workspace-name\": arg(z.string(), {\n alias: \"n\",\n description: \"Workspace name\",\n }),\n \"workspace-region\": arg(z.string(), {\n alias: \"r\",\n description: \"Workspace region\",\n }),\n // Required here because the generated workflow uses these for workspace creation.\n // Could be made optional in the future if we add conditional template rendering.\n \"organization-id\": arg(z.string(), {\n alias: \"o\",\n description: \"Organization ID\",\n }),\n \"folder-id\": arg(z.string(), {\n alias: \"f\",\n description: \"Folder ID\",\n }),\n dir: arg(z.string().default(\".\"), {\n alias: \"d\",\n description: \"App directory (for monorepo setups)\",\n }),\n \"with-plan\": arg(z.boolean().default(false), {\n alias: \"p\",\n description: \"Include plan job for PR previews\",\n }),\n })\n .strict(),\n run: (args) => {\n setupGitHub({\n workspaceName: args[\"workspace-name\"],\n workspaceRegion: args[\"workspace-region\"],\n organizationId: args[\"organization-id\"],\n folderId: args[\"folder-id\"],\n dir: args.dir,\n outputDir: process.cwd(),\n withPlan: args[\"with-plan\"],\n });\n },\n});\n","import { defineCommand } from \"politty\";\nimport { githubCommand } from \"./github\";\n\nexport const setupCommand = defineCommand({\n name: \"setup\",\n description: \"Set up project infrastructure.\",\n subCommands: {\n github: githubCommand,\n },\n});\n","import { spawn } from \"node:child_process\";\n\nexport const SKILL_NAME = \"tailor-sdk\";\nconst SKILLS_SOURCE_ENV_KEY = \"TAILOR_SDK_SKILLS_SOURCE\";\n\ninterface ChildProcessLike {\n on(event: \"close\", listener: (code: number | null) => void): ChildProcessLike;\n on(event: \"error\", listener: (error: Error) => void): ChildProcessLike;\n}\n\ntype SpawnLike = (\n command: string,\n args: string[],\n options: { stdio: \"inherit\" },\n) => ChildProcessLike;\n\nexport interface RunSkillsInstallerOptions {\n source: string;\n agent?: string;\n yes?: boolean;\n spawnFn?: SpawnLike;\n}\n\nfunction resolveNpxCommand(platform: NodeJS.Platform = process.platform): string {\n return platform === \"win32\" ? \"npx.cmd\" : \"npx\";\n}\n\nfunction resolveSkillsSource(source: string): string {\n return process.env[SKILLS_SOURCE_ENV_KEY] ?? source;\n}\n\n/**\n * Build CLI arguments for `skills add` with the fixed tailor-sdk skill target.\n * `--copy` is included so the installed skill survives `pnpm install` wiping `node_modules`.\n * @param options - Options controlling the generated `skills add` arguments\n * @param options.source\n * @param options.agent\n * @param options.yes\n * @returns CLI arguments for `npx skills add`\n */\nexport function buildSkillsAddArgs(options: {\n source: string;\n agent?: string;\n yes?: boolean;\n}): string[] {\n const args = [\n \"skills\",\n \"add\",\n resolveSkillsSource(options.source),\n \"--skill\",\n SKILL_NAME,\n \"--copy\",\n ];\n if (options.agent) args.push(\"--agent\", options.agent);\n if (options.yes) args.push(\"--yes\");\n return args;\n}\n\n/**\n * Run `npx skills add` to install the tailor-sdk skill.\n * @param options - Runtime options for skill installation\n * @returns Process exit code from the spawned `npx` command\n */\nexport async function runSkillsInstaller(options: RunSkillsInstallerOptions): Promise<number> {\n const args = buildSkillsAddArgs({\n source: options.source,\n agent: options.agent,\n yes: options.yes,\n });\n const spawnFn =\n options.spawnFn ??\n ((command: string, spawnArgs: string[], spawnOptions: { stdio: \"inherit\" }) =>\n spawn(command, spawnArgs, spawnOptions));\n\n const childProcess = spawnFn(resolveNpxCommand(), args, { stdio: \"inherit\" });\n\n return await new Promise<number>((resolve, reject) => {\n childProcess.on(\"error\", (error) => reject(error));\n childProcess.on(\"close\", (code) => resolve(code ?? 1));\n });\n}\n","import { dirname, resolve } from \"pathe\";\nimport { resolvePackageJSON } from \"pkg-types\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { runSkillsInstaller } from \"@/cli/shared/skills-installer\";\n\n// Resolve the SDK package root at runtime so the skills directory is found\n// regardless of how the file is bundled (tsdown inlines non-entry modules).\n// The directory is named `agent-skills` (not `skills`) to avoid `gh skill`'s\n// `**/skills/*/SKILL.md` recursive match that would otherwise pick up both\n// this bundled copy and the repo-root `skills/` and report a conflict.\nexport async function resolveBundledSkillsDir(): Promise<string> {\n const pkgJsonPath = await resolvePackageJSON(import.meta.url);\n return resolve(dirname(pkgJsonPath), \"agent-skills\");\n}\n\nconst DEFAULT_AGENT = \"claude-code\";\n\nexport const installCommand = defineAppCommand({\n name: \"install\",\n description: \"Install the tailor-sdk agent skill from the installed SDK package.\",\n args: z\n .object({\n agent: arg(z.string().default(DEFAULT_AGENT), {\n alias: \"a\",\n description: `vercel/skills agent name (e.g. ${DEFAULT_AGENT}, codex). Defaults to ${DEFAULT_AGENT}.`,\n }),\n yes: arg(z.boolean().default(false), {\n alias: \"y\",\n description: \"Auto-approve prompts.\",\n }),\n })\n .strict(),\n run: async (args) => {\n const exitCode = await runSkillsInstaller({\n source: await resolveBundledSkillsDir(),\n agent: args.agent,\n yes: args.yes,\n });\n if (exitCode !== 0) {\n process.exit(exitCode);\n }\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { installCommand } from \"./install\";\n\nexport const skillsCommand = defineCommand({\n name: \"skills\",\n description: \"Manage Tailor SDK agent skills.\",\n subCommands: {\n install: installCommand,\n },\n async run() {\n await runCommand(installCommand, []);\n },\n});\n","import { setTimeout } from \"node:timers/promises\";\n\n/**\n * Create a simple progress reporter that writes updates to stderr.\n * @param label - Label to prefix progress output\n * @param total - Total number of steps\n * @returns Progress helpers\n */\nexport function createProgress(label: string, total: number) {\n let current = 0;\n\n const update = () => {\n current += 1;\n const percent = Math.round((current / total) * 100);\n process.stderr.write(`\\r${label} ${current}/${total} (${percent}%)`);\n };\n\n const finish = () => {\n process.stderr.write(\"\\n\");\n };\n\n return { update, finish };\n}\n\n/**\n * Wrap a promise with a timeout, rejecting if the timeout elapses first.\n * @template T\n * @param p - Promise to await\n * @param ms - Timeout in milliseconds\n * @param message - Error message on timeout\n * @returns Result of the original promise if it completes in time\n */\nexport async function withTimeout<T>(p: Promise<T>, ms: number, message: string): Promise<T> {\n return await Promise.race([\n p,\n setTimeout(ms).then(() => {\n throw new Error(message);\n }),\n ]);\n}\n","import * as fs from \"fs\";\nimport { Code, ConnectError } from \"@connectrpc/connect\";\nimport { lookup as mimeLookup } from \"mime-types\";\nimport pLimit from \"p-limit\";\nimport * as path from \"pathe\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient, type OperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { createProgress, withTimeout } from \"@/cli/shared/progress\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport type { MessageInitShape } from \"@bufbuild/protobuf\";\nimport type { UploadFileRequestSchema } from \"@tailor-proto/tailor/v1/staticwebsite_pb\";\n\nconst CHUNK_SIZE = 64 * 1024; // 64KB\nconst IGNORED_FILES = new Set([\".DS_Store\", \"thumbs.db\", \"desktop.ini\"]);\nfunction shouldIgnoreFile(filePath: string) {\n const fileName = path.basename(filePath).toLowerCase();\n return IGNORED_FILES.has(fileName);\n}\n\nexport type DeployResult = {\n url: string;\n skippedFiles: string[];\n};\n\n/**\n * Deploy a static website by creating a deployment, uploading files, and publishing it.\n * @param client - Operator client instance\n * @param workspaceId - Workspace ID\n * @param name - Static website name\n * @param distDir - Directory containing static site files\n * @param showProgress - Whether to show upload progress\n * @returns Deployment result with URL and skipped files\n */\nexport async function deployStaticWebsite(\n client: OperatorClient,\n workspaceId: string,\n name: string,\n distDir: string,\n showProgress: boolean = true,\n): Promise<DeployResult> {\n const { deploymentId } = await client.createDeployment({\n workspaceId,\n name,\n });\n\n if (!deploymentId) {\n throw new Error(\"createDeployment returned empty deploymentId\");\n }\n\n const skippedFiles = await uploadDirectory(\n client,\n workspaceId,\n deploymentId,\n distDir,\n showProgress,\n );\n\n const { url } = await client.publishDeployment({\n workspaceId,\n deploymentId,\n });\n\n if (!url) {\n throw new Error(\"publishDeployment returned empty url\");\n }\n\n return { url, skippedFiles };\n}\n\nasync function uploadDirectory(\n client: OperatorClient,\n workspaceId: string,\n deploymentId: string,\n rootDir: string,\n showProgress: boolean,\n): Promise<string[]> {\n const files = await collectFiles(rootDir);\n if (files.length === 0) {\n logger.warn(`No files found under ${rootDir}`);\n return [];\n }\n\n const concurrency = 5;\n const limit = pLimit(concurrency);\n\n const total = files.length;\n const progress = showProgress ? createProgress(\"Uploading files\", total) : undefined;\n const skippedFiles: string[] = [];\n\n await Promise.all(\n files.map((relativePath) =>\n limit(async () => {\n await uploadSingleFile(\n client,\n workspaceId,\n deploymentId,\n rootDir,\n relativePath,\n skippedFiles,\n );\n if (progress) {\n progress.update();\n }\n }),\n ),\n );\n\n if (progress) {\n progress.finish();\n }\n\n return skippedFiles;\n}\n\n/**\n * Recursively collect all deployable files under the given directory.\n * @param rootDir - Root directory to scan\n * @param currentDir - Current relative directory (for recursion)\n * @returns List of file paths relative to rootDir\n */\nasync function collectFiles(rootDir: string, currentDir = \"\"): Promise<string[]> {\n const dirPath = path.join(rootDir, currentDir);\n\n const entries = await fs.promises.readdir(dirPath, {\n withFileTypes: true,\n });\n const files: string[] = [];\n\n for (const entry of entries) {\n const rel = path.join(currentDir, entry.name);\n if (entry.isDirectory()) {\n const sub = await collectFiles(rootDir, rel);\n files.push(...sub);\n } else if (entry.isFile() && !entry.isSymbolicLink() && !shouldIgnoreFile(rel)) {\n files.push(rel);\n }\n }\n\n return files;\n}\n\nasync function uploadSingleFile(\n client: OperatorClient,\n workspaceId: string,\n deploymentId: string,\n rootDir: string,\n filePath: string,\n skippedFiles: string[],\n): Promise<void> {\n const absPath = path.join(rootDir, filePath);\n\n const mime = mimeLookup(filePath);\n\n if (!mime) {\n skippedFiles.push(`${filePath} (unsupported content type; no MIME mapping found)`);\n return;\n }\n\n const contentType = mime;\n\n const readStream = fs.createReadStream(absPath, {\n highWaterMark: CHUNK_SIZE,\n });\n\n async function* requestStream(): AsyncIterable<MessageInitShape<typeof UploadFileRequestSchema>> {\n yield {\n payload: {\n case: \"initialMetadata\",\n value: {\n workspaceId,\n deploymentId,\n filePath,\n contentType,\n },\n },\n };\n for await (const chunk of readStream) {\n yield {\n payload: {\n case: \"chunkData\",\n value: chunk as Buffer,\n },\n };\n }\n }\n\n async function uploadWithLogging() {\n try {\n await client.uploadFile(requestStream());\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.InvalidArgument) {\n skippedFiles.push(`${filePath} (server rejected file as invalid: ${error.message})`);\n return;\n }\n // For non-validation errors, fail the deployment as before.\n throw error;\n }\n }\n\n await withTimeout(\n uploadWithLogging(),\n // 2 minutes per file\n 2 * 60_000,\n `Upload timed out for \"${filePath}\"`,\n );\n}\n\n/**\n * Log skipped files after a deployment, including reasons for skipping.\n * @param skippedFiles - List of skipped file descriptions\n */\nexport function logSkippedFiles(skippedFiles: string[]) {\n if (skippedFiles.length === 0) {\n return;\n }\n logger.warn(\n \"Deployment completed, but some files failed to upload. These files may have unsupported content types or other validation issues. Please review the list below:\",\n );\n for (const file of skippedFiles) {\n logger.log(` - ${file}`);\n }\n}\n\nexport const deployCommand = defineAppCommand({\n name: \"deploy\",\n description: \"Deploy a static website from a local build directory.\",\n args: z\n .object({\n ...workspaceArgs,\n name: arg(z.string(), {\n alias: \"n\",\n description: \"Static website name\",\n }),\n dir: arg(z.string(), {\n alias: \"d\",\n description: \"Path to the static website files\",\n completion: { type: \"directory\" },\n }),\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n logger.info(`Deploying static website \"${args.name}\" from directory: ${args.dir}`);\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n\n const name = args.name;\n const dir = path.resolve(process.cwd(), args.dir);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) {\n throw new Error(`Directory not found or not a directory: ${dir}`);\n }\n\n const { url, skippedFiles } = await withTimeout(\n deployStaticWebsite(client, workspaceId, name, dir, !args.json),\n // 10 minutes\n 10 * 60_000,\n \"Deployment timed out after 10 minutes.\",\n );\n\n if (args.json) {\n logger.out({ name, workspaceId, url, skippedFiles });\n } else {\n logger.success(`Static website \"${name}\" deployed successfully. URL: ${url}`);\n logSkippedFiles(skippedFiles);\n }\n },\n});\n","import { CustomDomainStatus } from \"@tailor-proto/tailor/v1/staticwebsite_resource_pb\";\n\nexport const statusLabels: Record<CustomDomainStatus, string> = {\n [CustomDomainStatus.UNSPECIFIED]: \"unspecified\",\n [CustomDomainStatus.PENDING]: \"pending\",\n [CustomDomainStatus.VERIFYING]: \"verifying\",\n [CustomDomainStatus.CERT_ISSUED]: \"cert_issued\",\n [CustomDomainStatus.ACTIVE]: \"active\",\n [CustomDomainStatus.FAILED]: \"failed\",\n};\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { statusLabels } from \"./status\";\n\nexport const domainGetCommand = defineAppCommand({\n name: \"get\",\n description: \"Get details of a custom domain.\",\n args: z\n .object({\n ...workspaceArgs,\n domain: arg(z.string(), {\n positional: true,\n description: \"Custom domain name\",\n }),\n })\n .strict(),\n run: async (args) => {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n const notFoundErrorMessage = `Custom domain \"${args.domain}\" not found.`;\n\n try {\n const { customDomain } = await client.getCustomDomain({\n workspaceId,\n domain: args.domain,\n });\n\n if (!customDomain) {\n throw new Error(notFoundErrorMessage);\n }\n\n const info = {\n domain: customDomain.domain,\n status: statusLabels[customDomain.status] ?? \"unknown\",\n trafficCnameTarget: customDomain.trafficCnameTarget,\n certificateCnameTarget: customDomain.certificateCnameTarget,\n errorMessage: customDomain.errorMessage || undefined,\n };\n\n logger.out(info);\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(notFoundErrorMessage, { cause: error });\n }\n throw error;\n }\n },\n});\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { statusLabels } from \"./status\";\n\nexport const domainListCommand = defineAppCommand({\n name: \"list\",\n description: \"List custom domains for a static website.\",\n args: z\n .object({\n ...workspaceArgs,\n name: arg(z.string(), {\n positional: true,\n description: \"Static website name\",\n }),\n })\n .strict(),\n run: async (args) => {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n try {\n const { customDomains } = await client.listCustomDomains({\n workspaceId,\n staticWebsiteName: args.name,\n });\n\n if (customDomains.length === 0) {\n logger.info(\"No custom domains found.\");\n return;\n }\n\n const formatted = customDomains.map((d) => ({\n domain: d.domain,\n status: statusLabels[d.status] ?? \"unknown\",\n trafficCnameTarget: d.trafficCnameTarget,\n certificateCnameTarget: d.certificateCnameTarget,\n }));\n\n logger.out(formatted);\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(`Static website \"${args.name}\" not found.`, { cause: error });\n }\n throw error;\n }\n },\n});\n","import { defineCommand } from \"politty\";\nimport { domainGetCommand } from \"./get\";\nimport { domainListCommand } from \"./list\";\n\nexport const domainCommand = defineCommand({\n name: \"domain\",\n description: \"Manage custom domains for static websites.\",\n subCommands: {\n list: domainListCommand,\n get: domainGetCommand,\n },\n});\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\n\nexport const getCommand = defineAppCommand({\n name: \"get\",\n description: \"Get details of a specific static website.\",\n args: z\n .object({\n ...workspaceArgs,\n name: arg(z.string(), {\n positional: true,\n description: \"Static website name\",\n }),\n })\n .strict(),\n run: async (args) => {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n const notFoundErrorMessage = `Static website \"${args.name}\" not found.`;\n\n try {\n const { staticwebsite } = await client.getStaticWebsite({\n workspaceId,\n name: args.name,\n });\n\n if (!staticwebsite) {\n throw new Error(notFoundErrorMessage);\n }\n\n const info = {\n workspaceId,\n name: staticwebsite.name,\n description: staticwebsite.description,\n url: staticwebsite.url,\n allowedIpAddresses: args.json\n ? staticwebsite.allowedIpAddresses\n : staticwebsite.allowedIpAddresses.join(\"\\n\"),\n };\n\n logger.out(info);\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(notFoundErrorMessage, { cause: error });\n }\n throw error;\n }\n },\n});\n","import { z } from \"zod\";\nimport { type Order, paginationArgs, toPageDirection, workspaceArgs } from \"@/cli/shared/args\";\nimport { fetchPaged, initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\n\nexport interface StaticWebsiteInfo {\n workspaceId: string;\n name: string;\n description: string;\n url: string;\n allowedIpAddresses: string[];\n}\n\ntype StaticWebsiteListOptions = {\n workspaceId?: string;\n profile?: string;\n order?: Order;\n limit?: number;\n};\n\n/**\n * List static websites in the workspace.\n * @param options - Static website listing options\n * @returns List of static websites\n */\nasync function listStaticWebsites(\n options?: StaticWebsiteListOptions,\n): Promise<StaticWebsiteInfo[]> {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options?.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: options?.workspaceId,\n profile: options?.profile,\n });\n\n const pageDirection = toPageDirection(options?.order);\n const websites = await fetchPaged(\n async (pageToken, pageSize) => {\n const { staticwebsites, nextPageToken } = await client.listStaticWebsites({\n workspaceId,\n pageToken,\n pageSize,\n pageDirection,\n });\n return [staticwebsites, nextPageToken];\n },\n { limit: options?.limit },\n );\n\n return websites.map((site) => ({\n workspaceId,\n name: site.name,\n description: site.description,\n url: site.url ?? \"\",\n allowedIpAddresses: site.allowedIpAddresses,\n }));\n}\n\nexport const listCommand = defineAppCommand({\n name: \"list\",\n description: \"List all static websites in a workspace.\",\n args: z\n .object({\n ...workspaceArgs,\n ...paginationArgs(),\n })\n .strict(),\n run: async (args) => {\n const jsonOutput = logger.jsonMode;\n const websites = await listStaticWebsites({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n order: args.order,\n limit: args.limit,\n });\n\n const formatted = jsonOutput\n ? websites\n : websites.map(({ allowedIpAddresses, ...rest }) => {\n if (allowedIpAddresses.length === 0) {\n return {\n ...rest,\n allowedIpAddresses: \"No allowed IP addresses\",\n };\n }\n\n const count = allowedIpAddresses.length;\n const label = count === 1 ? \"1 IP address\" : `${count} IP addresses`;\n\n return {\n ...rest,\n allowedIpAddresses: label,\n };\n });\n\n logger.out(formatted);\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { deployCommand } from \"./deploy\";\nimport { domainCommand } from \"./domain\";\nimport { getCommand } from \"./get\";\nimport { listCommand } from \"./list\";\n\nexport const staticwebsiteCommand = defineCommand({\n name: \"staticwebsite\",\n description: \"Manage static websites in your workspace.\",\n subCommands: {\n deploy: deployCommand,\n domain: domainCommand,\n list: listCommand,\n get: getCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { defineApplication } from \"@/cli/services/application\";\nimport { loadConfig } from \"@/cli/shared/config-loader\";\nimport { generateUserTypes } from \"@/cli/shared/type-generator\";\nimport { PluginManager } from \"@/plugin/manager\";\nimport type { LoadedConfig } from \"@/cli/shared/config-loader\";\nimport type { TailorDBNamespaceData } from \"@/types/plugin-generation\";\n\nexport interface LoadLocalErdSchemaOptions {\n configPath?: string;\n namespaces?: string[];\n requireErdSite?: boolean;\n}\n\nexport interface LocalErdSchemaContext {\n config: LoadedConfig;\n namespaces: TailorDBNamespaceData[];\n}\n\nexport interface ResolveLocalErdSchemaNamespacesOptions {\n /** Explicit namespace selection. */\n namespaces?: string[];\n /** Limit implicit selection to owned namespaces with erdSite configured. */\n requireErdSite?: boolean;\n}\n\n/**\n * Resolve TailorDB namespaces that need local type loading for ERD generation.\n * @param config - Loaded Tailor config.\n * @param options - Namespace selection options.\n * @returns Namespace names to load, or undefined to load all owned namespaces.\n */\nexport function resolveLocalErdSchemaNamespaces(\n config: LoadedConfig,\n options: ResolveLocalErdSchemaNamespacesOptions,\n): string[] | undefined {\n if (options.namespaces) {\n return options.namespaces;\n }\n if (!options.requireErdSite) {\n return undefined;\n }\n\n return Object.entries(config.db ?? {}).flatMap(([namespace, dbConfig]) =>\n \"external\" in dbConfig || !dbConfig.erdSite ? [] : [namespace],\n );\n}\n\n/**\n * Load local TailorDB namespaces exactly as SDK generation/deploy sees them.\n * @param options - Local schema loading options.\n * @returns Loaded TailorDB namespace data.\n */\nexport async function loadLocalErdSchema(\n options: LoadLocalErdSchemaOptions,\n): Promise<LocalErdSchemaContext> {\n const { config, plugins } = await loadConfig(options.configPath);\n\n await generateUserTypes({ config, configPath: config.path });\n\n const pluginManager = plugins.length > 0 ? new PluginManager(plugins) : undefined;\n const application = defineApplication({\n config,\n pluginManager,\n });\n const namespaceNames = resolveLocalErdSchemaNamespaces(config, {\n namespaces: options.namespaces,\n requireErdSite: options.requireErdSite,\n });\n const namespaceFilter = namespaceNames ? new Set(namespaceNames) : undefined;\n const services = namespaceFilter\n ? application.tailorDBServices.filter((db) => namespaceFilter.has(db.namespace))\n : application.tailorDBServices;\n\n if (namespaceFilter && services.length !== namespaceFilter.size) {\n const available = application.tailorDBServices.map((db) => db.namespace).join(\", \");\n const requested = [...namespaceFilter].join(\", \");\n throw new Error(\n `TailorDB namespace \"${requested}\" not found in local config.db.` +\n (available ? ` Available owned namespaces: ${available}` : \"\"),\n );\n }\n\n const namespaces: TailorDBNamespaceData[] = [];\n\n for (const db of services) {\n await db.loadTypes();\n await db.processNamespacePlugins();\n namespaces.push({\n namespace: db.namespace,\n types: { ...db.types },\n sourceInfo: new Map(Object.entries(db.typeSourceInfo)),\n pluginAttachments: db.pluginAttachments,\n });\n }\n\n return { config, namespaces };\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"pathe\";\nimport { hashContent } from \"@/cli/cache/hasher\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { isPluginGeneratedType } from \"@/types/tailordb\";\nimport type {\n TailorDbErdColumn,\n TailorDbErdColumnRelation,\n TailorDbErdIndex,\n TailorDbErdRelation,\n TailorDbErdRelationship,\n TailorDbErdSchema,\n TailorDbErdSource,\n TailorDbErdTable,\n TailorDbErdTypeSource,\n} from \"./types\";\nimport type { TailorDBNamespaceData } from \"@/types/plugin-generation\";\nimport type {\n OperatorFieldConfig,\n ParsedField,\n TailorDBType,\n TypeSourceInfoEntry,\n} from \"@/types/tailordb\";\n\nconst CLEAN_ROOM_NOTES = [\n \"Generated by a TailorDB-specific viewer implementation.\",\n \"The implementation is based on TailorDB schema contracts, public Liam documentation, Liam CLI help, and black-box generated-output observation.\",\n \"It does not copy Liam source code, generated JavaScript/CSS, parser internals, or layout internals.\",\n];\n\ninterface BuildTailorDbErdSchemaOptions {\n namespaceData: TailorDBNamespaceData;\n generatedAt?: string;\n source?: TailorDbErdSource;\n}\n\ninterface WriteTailorDbErdSchemaOptions {\n schema: TailorDbErdSchema;\n outputPath: string;\n}\n\ninterface BuildColumnOptions {\n fieldName: string;\n fieldConfig: OperatorFieldConfig;\n parsedField?: ParsedField;\n indexEntries: Array<[string, TailorDbErdIndex]>;\n}\n\nfunction buildRevision(schema: Omit<TailorDbErdSchema, \"generatedAt\" | \"revision\">): string {\n return hashContent(JSON.stringify(schema)).slice(0, 16);\n}\n\nfunction toTypeSource(source: TypeSourceInfoEntry | undefined): TailorDbErdTypeSource | undefined {\n if (!source) return undefined;\n if (isPluginGeneratedType(source)) {\n return {\n kind: \"plugin\",\n exportName: source.exportName,\n pluginId: source.pluginId,\n pluginImportPath: source.pluginImportPath,\n originalExportName: source.originalExportName,\n generatedTypeKind: source.generatedTypeKind,\n namespace: source.namespace,\n };\n }\n return {\n kind: \"user\",\n exportName: source.exportName,\n };\n}\n\nfunction toRelationships(\n relationships: Record<string, TailorDBType[\"forwardRelationships\"][string]>,\n): TailorDbErdRelationship[] {\n return Object.entries(relationships)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([name, relationship]) => ({\n name,\n targetType: relationship.targetType,\n targetField: relationship.targetField,\n sourceField: relationship.sourceField,\n isArray: relationship.isArray,\n ...(relationship.description && { description: relationship.description }),\n }));\n}\n\nfunction toIndexes(type: TailorDBType): TailorDbErdIndex[] {\n return Object.entries(type.indexes ?? {})\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([name, index]) => ({\n name,\n fields: [...index.fields],\n unique: index.unique === true,\n }));\n}\n\nfunction toColumnRelation(options: BuildColumnOptions): TailorDbErdColumnRelation | undefined {\n const { fieldConfig, parsedField } = options;\n if (!fieldConfig.foreignKey || !fieldConfig.foreignKeyType) {\n return undefined;\n }\n\n const required = fieldConfig.required !== false;\n const kind = parsedField?.relation || fieldConfig.rawRelation ? \"relation\" : \"foreignKey\";\n return {\n targetTable: fieldConfig.foreignKeyType,\n targetColumn: fieldConfig.foreignKeyField || \"id\",\n kind,\n required,\n ...(fieldConfig.rawRelation?.type && { relationType: fieldConfig.rawRelation.type }),\n ...(parsedField?.relation?.forwardName && { forwardName: parsedField.relation.forwardName }),\n ...(parsedField?.relation?.backwardName && {\n backwardName: parsedField.relation.backwardName,\n }),\n };\n}\n\nfunction toColumn(options: BuildColumnOptions): TailorDbErdColumn {\n const { fieldName, fieldConfig } = options;\n const indexNames = options.indexEntries\n .filter(([, index]) => index.fields.includes(fieldName))\n .map(([name]) => name);\n const uniqueIndexNames = options.indexEntries\n .filter(([, index]) => index.unique && index.fields.includes(fieldName))\n .map(([name]) => name);\n\n const enumValues = fieldConfig.allowedValues?.map((value) => value.value) ?? [];\n const enumValueDescriptions = Object.fromEntries(\n (fieldConfig.allowedValues ?? []).flatMap((value) =>\n value.description ? [[value.value, value.description]] : [],\n ),\n );\n const nestedFields = Object.entries(fieldConfig.fields ?? {}).map(([nestedName, nestedConfig]) =>\n toColumn({\n fieldName: nestedName,\n fieldConfig: nestedConfig,\n indexEntries: [],\n }),\n );\n const relation = toColumnRelation(options);\n\n return {\n name: fieldName,\n type: fieldConfig.type || \"string\",\n required: fieldConfig.required !== false,\n array: fieldConfig.array === true,\n ...(fieldConfig.description && { description: fieldConfig.description }),\n ...(fieldConfig.unique && { unique: true }),\n ...((fieldConfig.index || indexNames.length > 0) && { index: true }),\n ...(indexNames.length > 0 && { indexNames }),\n ...(uniqueIndexNames.length > 0 && { uniqueIndexNames }),\n ...(enumValues.length > 0 && { enumValues }),\n ...(Object.keys(enumValueDescriptions).length > 0 && { enumValueDescriptions }),\n ...(fieldConfig.vector && { vector: true }),\n ...(fieldConfig.serial && { serial: { ...fieldConfig.serial } }),\n ...(fieldConfig.scale !== undefined && { scale: fieldConfig.scale }),\n ...(fieldConfig.validate?.length && { validations: fieldConfig.validate.length }),\n ...(fieldConfig.hooks && {\n hooks: {\n ...(fieldConfig.hooks.create && { create: true }),\n ...(fieldConfig.hooks.update && { update: true }),\n },\n }),\n ...(nestedFields.length > 0 && { fields: nestedFields }),\n ...(relation && { relation }),\n };\n}\n\nfunction toTable(type: TailorDBType, source: TypeSourceInfoEntry | undefined): TailorDbErdTable {\n const indexes = toIndexes(type);\n const indexEntries: Array<[string, TailorDbErdIndex]> = indexes.map((index) => [\n index.name,\n index,\n ]);\n const fieldColumns = Object.entries(type.fields)\n .filter(([fieldName]) => fieldName !== \"id\")\n .map(([fieldName, field]) =>\n toColumn({\n fieldName,\n fieldConfig: field.config,\n parsedField: field,\n indexEntries,\n }),\n );\n\n const typeSource = toTypeSource(source);\n\n return {\n name: type.name,\n pluralForm: type.pluralForm,\n ...(type.description && { description: type.description }),\n ...(typeSource && { source: typeSource }),\n columns: [\n {\n name: \"id\",\n type: \"uuid\",\n required: true,\n array: false,\n primaryKey: true,\n unique: true,\n },\n ...fieldColumns,\n ],\n indexes,\n forwardRelationships: toRelationships(type.forwardRelationships),\n backwardRelationships: toRelationships(type.backwardRelationships),\n };\n}\n\nfunction toRelation(sourceTable: string, field: ParsedField): TailorDbErdRelation | undefined {\n const relation = toColumnRelation({\n fieldName: field.name,\n fieldConfig: field.config,\n parsedField: field,\n indexEntries: [],\n });\n if (!relation) return undefined;\n\n return {\n name: `${sourceTable}.${field.name}->${relation.targetTable}.${relation.targetColumn}`,\n sourceTable,\n sourceColumns: [field.name],\n targetTable: relation.targetTable,\n targetColumns: [relation.targetColumn],\n required: relation.required,\n unique: field.config.unique === true || field.relation?.unique === true,\n kind: relation.kind,\n ...(relation.relationType && { relationType: relation.relationType }),\n ...(relation.forwardName && { forwardName: relation.forwardName }),\n ...(relation.backwardName && { backwardName: relation.backwardName }),\n };\n}\n\nfunction buildRelations(types: Record<string, TailorDBType>): TailorDbErdRelation[] {\n const relations: TailorDbErdRelation[] = [];\n for (const type of Object.values(types)) {\n for (const field of Object.values(type.fields)) {\n const relation = toRelation(type.name, field);\n if (relation) {\n relations.push(relation);\n }\n }\n }\n return relations.sort((a, b) => a.name.localeCompare(b.name));\n}\n\n/**\n * Build the TailorDB ERD viewer schema for one namespace.\n * @param options - Schema build options.\n * @returns TailorDB ERD viewer schema.\n */\nexport function buildTailorDbErdSchema(options: BuildTailorDbErdSchemaOptions): TailorDbErdSchema {\n const { namespaceData } = options;\n const tables = Object.values(namespaceData.types)\n .sort((a, b) => a.name.localeCompare(b.name))\n .map((type) => toTable(type, namespaceData.sourceInfo.get(type.name)));\n\n const schemaWithoutRevision = {\n version: 1 as const,\n namespace: namespaceData.namespace,\n source: options.source ?? \"local\",\n cleanRoom: {\n implementation: \"tailor-sdk\" as const,\n notes: CLEAN_ROOM_NOTES,\n },\n tables,\n relations: buildRelations(namespaceData.types),\n };\n\n return {\n ...schemaWithoutRevision,\n generatedAt: options.generatedAt ?? new Date().toISOString(),\n revision: buildRevision(schemaWithoutRevision),\n };\n}\n\n/**\n * Writes a TailorDB ERD viewer schema to disk.\n * @param options - Schema write options.\n */\nexport function writeTailorDbErdSchemaToFile(options: WriteTailorDbErdSchemaOptions): void {\n const json = JSON.stringify(options.schema, null, 2);\n fs.mkdirSync(path.dirname(options.outputPath), { recursive: true });\n fs.writeFileSync(options.outputPath, json, \"utf8\");\n\n const relativePath = path.relative(process.cwd(), options.outputPath);\n logger.success(`Wrote ERD schema to ${relativePath}`);\n}\n","import { logBetaWarning } from \"@/cli/shared/beta\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport type { OperatorClient } from \"@/cli/shared/client\";\n\nexport interface ErdDeployContext {\n client: OperatorClient;\n workspaceId: string;\n}\n\ntype ErdDeployContextOptions = {\n profile?: string;\n workspaceId?: string;\n};\n\n/**\n * Initialize shared ERD command behavior.\n */\nexport function initErdCommand(): void {\n logBetaWarning(\"tailordb erd\");\n}\n\n/**\n * Initialize platform context for ERD deployment.\n * @param args - CLI arguments.\n * @returns Initialized deploy context.\n */\nexport async function initErdDeployContext(\n args: ErdDeployContextOptions,\n): Promise<ErdDeployContext> {\n initErdCommand();\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args.workspaceId,\n profile: args.profile,\n });\n\n return { client, workspaceId };\n}\n","import * as fs from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport * as path from \"pathe\";\nimport type { TailorDbErdSchema } from \"./types\";\n\nconst VIEWER_ASSETS_DIR = \"erd-viewer-assets\";\nconst STYLES_LINK = '<link rel=\"stylesheet\" href=\"./styles.css\" />';\nconst APP_SCRIPT = '<script src=\"./app.js\" type=\"module\"></script>';\n\nexport interface WriteViewerDistOptions {\n schema: TailorDbErdSchema;\n distDir: string;\n}\n\nexport interface BuildViewerHtmlOptions {\n schema: TailorDbErdSchema;\n}\n\nfunction assetDirCandidates(): string[] {\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\n return [\n path.join(currentDir, \"viewer-assets\"),\n path.join(currentDir, VIEWER_ASSETS_DIR),\n path.join(currentDir, \"commands\", \"tailordb\", \"erd\", VIEWER_ASSETS_DIR),\n path.resolve(process.cwd(), \"packages/sdk/src/cli/commands/tailordb/erd/viewer-assets\"),\n ];\n}\n\n/**\n * Resolve the packaged ERD viewer asset directory.\n * @returns Absolute path to the viewer asset directory.\n */\nexport function resolveViewerAssetsDir(): string {\n for (const candidate of assetDirCandidates()) {\n if (fs.existsSync(path.join(candidate, \"index.html\"))) {\n return candidate;\n }\n }\n\n throw new Error(`ERD viewer assets not found. Checked: ${assetDirCandidates().join(\", \")}`);\n}\n\n/**\n * Build the self-contained ERD viewer HTML document. CSS, JS, and the schema\n * are inlined as separately extractable blocks: a `<style>` element, a\n * `<script type=\"module\">`, and a `<script type=\"application/json\"\n * id=\"erd-schema\">` data block. This renders without any sibling asset files\n * and lets external tooling (e.g. a future ERD diff) pull out the schema via\n * `JSON.parse`.\n * @param options - Viewer build options.\n * @returns The self-contained HTML document.\n */\nexport function buildViewerHtml(options: BuildViewerHtmlOptions): string {\n const assetsDir = resolveViewerAssetsDir();\n const html = fs.readFileSync(path.join(assetsDir, \"index.html\"), \"utf8\");\n const css = fs.readFileSync(path.join(assetsDir, \"styles.css\"), \"utf8\");\n const appJs = fs.readFileSync(path.join(assetsDir, \"app.js\"), \"utf8\");\n\n if (!html.includes(STYLES_LINK) || !html.includes(APP_SCRIPT)) {\n throw new Error(\"ERD viewer index.html is missing expected asset references for inlining.\");\n }\n\n // Embed the schema as JSON data (not executable JS) so it is both consumed by\n // the viewer and trivially extractable by external tooling (e.g. a future ERD\n // diff). Escape \"<\" so a value like \"</script>\" cannot terminate the data\n // <script> element early; JSON.parse restores the original characters.\n const schemaJson = JSON.stringify(options.schema).replaceAll(\"<\", \"\\\\u003c\");\n const embedScript = `<script type=\"application/json\" id=\"erd-schema\">${schemaJson}</script>`;\n // Escape any \"</script\" in the inlined module so it cannot terminate the\n // <script> element early. \"<\\/script\" is equivalent JS (\\/ === /).\n const safeAppJs = appJs.replace(/<\\/script/gi, \"<\\\\/script\");\n const inlineScript = `<script type=\"module\">\\n${safeAppJs}\\n</script>`;\n\n return html\n .replace(STYLES_LINK, `<style>\\n${css}\\n</style>`)\n .replace(APP_SCRIPT, `${embedScript}\\n ${inlineScript}`);\n}\n\n/**\n * Write the self-contained TailorDB ERD viewer to `<distDir>/index.html`.\n * @param options - Viewer dist write options.\n */\nexport function writeViewerDist(options: WriteViewerDistOptions): void {\n fs.rmSync(options.distDir, { recursive: true, force: true });\n fs.mkdirSync(options.distDir, { recursive: true });\n fs.writeFileSync(\n path.join(options.distDir, \"index.html\"),\n buildViewerHtml({ schema: options.schema }),\n \"utf8\",\n );\n}\n","import * as path from \"pathe\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { configArg } from \"@/cli/shared/args\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { loadLocalErdSchema, type LocalErdSchemaContext } from \"./local-schema\";\nimport { buildTailorDbErdSchema } from \"./schema\";\nimport { initErdCommand } from \"./utils\";\nimport { writeViewerDist } from \"./viewer\";\nimport type { TailorDBNamespaceData } from \"@/types/plugin-generation\";\n\nconst DEFAULT_ERD_BASE_DIR = \".tailor-sdk/erd\";\n\ninterface ResolveTargetsOptions {\n context: LocalErdSchemaContext;\n namespace?: string;\n outputDir: string;\n requireErdSite?: boolean;\n}\n\ninterface ErdTarget {\n namespaceData: TailorDBNamespaceData;\n erdSite?: string;\n distDir: string;\n}\n\ninterface ErdBuildsOptions {\n configPath?: string;\n namespace?: string;\n outputDir?: string;\n requireErdSite?: boolean;\n}\n\ninterface ErdBuildsFromContextOptions {\n context: LocalErdSchemaContext;\n namespace?: string;\n outputDir?: string;\n requireErdSite?: boolean;\n}\n\nexport interface ErdBuildResult {\n namespace: string;\n erdSite?: string;\n distDir: string;\n}\n\nfunction getErdSite(context: LocalErdSchemaContext, namespace: string): string | undefined {\n const dbConfig = context.config.db?.[namespace];\n if (!dbConfig || \"external\" in dbConfig) {\n return undefined;\n }\n return dbConfig.erdSite;\n}\n\nfunction resolveExplicitTarget(options: ResolveTargetsOptions): ErdTarget {\n const namespaceData = options.context.namespaces.find(\n (candidate) => candidate.namespace === options.namespace,\n );\n if (!namespaceData) {\n const available = options.context.namespaces.map((candidate) => candidate.namespace).join(\", \");\n throw new Error(\n `TailorDB namespace \"${options.namespace}\" not found in local config.db.` +\n (available ? ` Available owned namespaces: ${available}` : \"\"),\n );\n }\n\n const erdSite = getErdSite(options.context, namespaceData.namespace);\n if (options.requireErdSite && !erdSite) {\n throw new Error(\n `No erdSite configured for namespace \"${namespaceData.namespace}\". ` +\n `Add erdSite: \"<static-website-name>\" to db.${namespaceData.namespace} in tailor.config.ts.`,\n );\n }\n\n return toTarget(options.outputDir, namespaceData, erdSite);\n}\n\nfunction resolveAllTargets(options: ResolveTargetsOptions): ErdTarget[] {\n const namespaces = options.context.namespaces.filter(\n (namespaceData) =>\n !options.requireErdSite || getErdSite(options.context, namespaceData.namespace),\n );\n if (namespaces.length === 0) {\n throw new Error(\n options.requireErdSite\n ? \"No namespaces with erdSite configured found. \" +\n 'Add erdSite: \"<static-website-name>\" to db.<namespace> in tailor.config.ts.'\n : \"No TailorDB namespaces found in config. Please define db services in tailor.config.ts.\",\n );\n }\n\n logger.info(\n `Found ${namespaces.length} namespace(s)${options.requireErdSite ? \" with erdSite configured\" : \"\"}.`,\n );\n return namespaces.map((namespaceData) =>\n toTarget(\n options.outputDir,\n namespaceData,\n getErdSite(options.context, namespaceData.namespace),\n ),\n );\n}\n\nfunction toTarget(\n outputDir: string,\n namespaceData: TailorDBNamespaceData,\n erdSite: string | undefined,\n): ErdTarget {\n const distDir = path.join(outputDir, namespaceData.namespace, \"dist\");\n return {\n namespaceData,\n erdSite,\n distDir,\n };\n}\n\nfunction resolveTargets(options: ResolveTargetsOptions): ErdTarget[] {\n if (options.namespace) {\n return [resolveExplicitTarget(options)];\n }\n return resolveAllTargets(options);\n}\n\nfunction prepareErdBuild(target: ErdTarget): ErdBuildResult {\n const schema = buildTailorDbErdSchema({ namespaceData: target.namespaceData });\n writeViewerDist({ schema, distDir: target.distDir });\n\n const relativePath = path.relative(process.cwd(), target.distDir);\n logger.success(`Built ERD to ${relativePath}`);\n\n return {\n namespace: target.namespaceData.namespace,\n erdSite: target.erdSite,\n distDir: target.distDir,\n };\n}\n\n/**\n * Prepare TailorDB ERD static viewer builds for one or more namespaces.\n * @param options - Build options.\n * @returns Build results by namespace.\n */\nexport async function prepareErdBuilds(options: ErdBuildsOptions): Promise<ErdBuildResult[]> {\n const context = await loadLocalErdSchema({\n configPath: options.configPath,\n namespaces: options.namespace ? [options.namespace] : undefined,\n requireErdSite: options.requireErdSite,\n });\n return prepareErdBuildsFromContext({\n context,\n namespace: options.namespace,\n outputDir: options.outputDir,\n requireErdSite: options.requireErdSite,\n });\n}\n\n/**\n * Prepare TailorDB ERD static viewer builds from an already loaded schema context.\n * @param options - Build options.\n * @returns Build results by namespace.\n */\nexport function prepareErdBuildsFromContext(\n options: ErdBuildsFromContextOptions,\n): ErdBuildResult[] {\n const outputDir = path.resolve(process.cwd(), options.outputDir ?? DEFAULT_ERD_BASE_DIR);\n const targets = resolveTargets({\n context: options.context,\n namespace: options.namespace,\n outputDir,\n requireErdSite: options.requireErdSite,\n });\n\n return targets.map((target) => prepareErdBuild(target));\n}\n\nexport const erdExportCommand = defineAppCommand({\n name: \"export\",\n description: \"Export TailorDB ERD static viewer from local TailorDB schema.\",\n args: z\n .object({\n ...configArg,\n namespace: arg(z.string().optional(), {\n alias: \"n\",\n description:\n \"TailorDB namespace name (optional if only one namespace is defined in config)\",\n }),\n output: arg(z.string().default(DEFAULT_ERD_BASE_DIR), {\n alias: \"o\",\n description:\n \"Output directory path for TailorDB ERD viewer files (writes to `<outputDir>/<namespace>/dist`)\",\n completion: { type: \"directory\" },\n }),\n })\n .strict(),\n run: async (args) => {\n initErdCommand();\n\n const results = await prepareErdBuilds({\n configPath: args.config,\n namespace: args.namespace,\n outputDir: args.output,\n });\n\n logger.newline();\n if (args.json) {\n logger.out(\n results.map((result) => ({\n namespace: result.namespace,\n distDir: result.distDir,\n })),\n );\n } else {\n for (const result of results) {\n logger.out(`Exported ERD for namespace \"${result.namespace}\"`);\n logger.out(` - ERD viewer: ${path.join(result.distDir, \"index.html\")}`);\n }\n }\n },\n});\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { deploymentArgs } from \"@/cli/shared/args\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport { deployStaticWebsite, logSkippedFiles } from \"../../staticwebsite/deploy\";\nimport { prepareErdBuilds } from \"./export\";\nimport { initErdDeployContext } from \"./utils\";\n\nexport const erdDeployCommand = defineAppCommand({\n name: \"deploy\",\n description: \"Deploy ERD static website for TailorDB namespace(s).\",\n args: z\n .object({\n ...deploymentArgs,\n namespace: arg(z.string().optional(), {\n alias: \"n\",\n description:\n \"TailorDB namespace name (optional - deploys all namespaces with erdSite if omitted)\",\n }),\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n const { client, workspaceId } = await initErdDeployContext(args);\n const buildResults = await prepareErdBuilds({\n configPath: args.config,\n namespace: args.namespace,\n requireErdSite: true,\n });\n\n const deployResults = await Promise.all(\n buildResults.map(async (result) => {\n if (!result.erdSite) {\n throw new Error(\n `No erdSite configured for namespace \"${result.namespace}\". ` +\n `Add erdSite: \"<static-website-name>\" to db.${result.namespace} in tailor.config.ts.`,\n );\n }\n\n if (!args.json) {\n logger.info(\n `Deploying ERD for namespace \"${result.namespace}\" to site \"${result.erdSite}\"...`,\n );\n }\n\n const { url, skippedFiles } = await deployStaticWebsite(\n client,\n workspaceId,\n result.erdSite,\n result.distDir,\n !args.json,\n );\n\n return {\n namespace: result.namespace,\n erdSite: result.erdSite,\n url,\n skippedFiles,\n };\n }),\n );\n logger.newline();\n\n if (args.json) {\n logger.out(deployResults);\n } else {\n for (const result of deployResults) {\n logSkippedFiles(result.skippedFiles);\n logger.newline();\n logger.success(`ERD site \"${result.erdSite}\" deployed successfully.`);\n logger.out(result.url);\n }\n }\n },\n});\n","import { spawn } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport { glob } from \"node:fs/promises\";\nimport * as http from \"node:http\";\nimport { watch, type FSWatcher } from \"chokidar\";\nimport { lookup as lookupMime } from \"mime-types\";\nimport open from \"open\";\nimport * as path from \"pathe\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { configArg } from \"@/cli/shared/args\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadConfig, type LoadedConfig } from \"@/cli/shared/config-loader\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { prepareErdBuildsFromContext, type ErdBuildResult } from \"./export\";\nimport { loadLocalErdSchema, type LocalErdSchemaContext } from \"./local-schema\";\nimport { initErdCommand } from \"./utils\";\n\nconst DEFAULT_ERD_BASE_DIR = \".tailor-sdk/erd\";\nconst LOCAL_HOST = \"127.0.0.1\";\n\ninterface StaticServerResult {\n server: http.Server;\n url: string;\n}\n\ninterface StartStaticServerOptions {\n distDir: string;\n port: number;\n}\n\ninterface WatchOptions {\n configPath?: string;\n namespace?: string;\n outputDir: string;\n initialContext: LocalErdSchemaContext;\n initialResults: ErdBuildResult[];\n}\n\ninterface FreshErdExportOptions {\n configPath?: string;\n namespace?: string;\n outputDir: string;\n}\n\ninterface ErdExportJsonResult {\n namespace: string;\n distDir: string;\n}\n\ninterface OpenStaticFileResult {\n filePath: string;\n fd: number;\n}\n\nconst GLOB_CHARS = /[*?[\\]{}()!+@]/;\n\nfunction formatServeCommand(namespace: string): string {\n return `tailor-sdk tailordb erd serve --namespace ${namespace}`;\n}\n\nfunction getCacheControl(filePath: string): string {\n return filePath.endsWith(\".html\") || filePath.endsWith(\".json\")\n ? \"no-cache\"\n : \"public, max-age=3600\";\n}\n\nfunction resolveRequestPath(distDir: string, requestUrl: string | undefined): string | undefined {\n const url = new URL(requestUrl ?? \"/\", \"http://localhost\");\n let pathname: string;\n try {\n pathname = decodeURIComponent(url.pathname);\n } catch {\n return undefined;\n }\n\n if (pathname === \"/\" || pathname.endsWith(\"/\")) {\n pathname = path.join(pathname, \"index.html\");\n }\n\n const root = path.resolve(distDir);\n const filePath = path.resolve(root, `.${pathname}`);\n if (filePath !== root && !filePath.startsWith(`${root}${path.sep}`)) {\n return undefined;\n }\n return filePath;\n}\n\nfunction openStaticFile(filePath: string): OpenStaticFileResult | undefined {\n let fd: number | undefined;\n try {\n fd = fs.openSync(filePath, \"r\");\n if (!fs.fstatSync(fd).isFile()) {\n fs.closeSync(fd);\n return undefined;\n }\n return { filePath, fd };\n } catch {\n if (fd !== undefined) {\n fs.closeSync(fd);\n }\n return undefined;\n }\n}\n\nfunction serveFile(distDir: string, req: http.IncomingMessage, res: http.ServerResponse): void {\n const filePath = resolveRequestPath(distDir, req.url);\n if (!filePath) {\n res.writeHead(403);\n res.end(\"Forbidden\");\n return;\n }\n\n const fallbackPath = path.join(distDir, \"index.html\");\n const target = openStaticFile(filePath) ?? openStaticFile(fallbackPath);\n if (!target) {\n res.writeHead(503, {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n \"Cache-Control\": \"no-cache\",\n \"Retry-After\": \"1\",\n });\n res.end(\"ERD build is refreshing. Please retry.\");\n return;\n }\n\n const mimeType = lookupMime(target.filePath) || \"application/octet-stream\";\n const stream = fs.createReadStream(target.filePath, {\n fd: target.fd,\n autoClose: true,\n });\n stream.on(\"error\", () => {\n if (!res.headersSent) {\n res.writeHead(503, {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n \"Cache-Control\": \"no-cache\",\n \"Retry-After\": \"1\",\n });\n res.end(\"ERD build is refreshing. Please retry.\");\n return;\n }\n res.destroy();\n });\n res.writeHead(200, {\n \"Content-Type\": mimeType,\n \"Cache-Control\": getCacheControl(target.filePath),\n });\n stream.pipe(res);\n}\n\nasync function startStaticServer(options: StartStaticServerOptions): Promise<StaticServerResult> {\n const server = http.createServer((req, res) => {\n serveFile(options.distDir, req, res);\n });\n\n return await new Promise<StaticServerResult>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(options.port, LOCAL_HOST, () => {\n server.off(\"error\", reject);\n const address = server.address();\n if (!address || typeof address === \"string\") {\n reject(new Error(\"Failed to determine ERD server address.\"));\n return;\n }\n resolve({\n server,\n url: `http://${LOCAL_HOST}:${address.port}`,\n });\n });\n });\n}\n\nfunction getWatchPatterns(config: LoadedConfig, results: ErdBuildResult[]): string[] {\n const namespaces = new Set(results.map((result) => result.namespace));\n const patterns = [config.path];\n for (const namespace of namespaces) {\n const dbConfig = config.db?.[namespace];\n if (dbConfig && !(\"external\" in dbConfig)) {\n patterns.push(...dbConfig.files);\n }\n }\n return [...new Set(patterns)];\n}\n\nfunction hasGlobPattern(pattern: string): boolean {\n return GLOB_CHARS.test(pattern);\n}\n\nfunction globBaseDir(pattern: string): string {\n const absolutePattern = path.resolve(pattern);\n const parsed = path.parse(absolutePattern);\n const relativePattern = absolutePattern.slice(parsed.root.length);\n const literalParts: string[] = [];\n for (const part of relativePattern.split(path.sep)) {\n if (!part || GLOB_CHARS.test(part)) break;\n literalParts.push(part);\n }\n\n const literalPath =\n literalParts.length > 0 ? path.join(parsed.root, ...literalParts) : parsed.root;\n if (!literalPath || literalPath === parsed.root) return parsed.root || process.cwd();\n if (!fs.existsSync(literalPath)) return path.dirname(literalPath);\n return fs.statSync(literalPath).isDirectory() ? literalPath : path.dirname(literalPath);\n}\n\nasync function expandWatchPattern(pattern: string): Promise<string[]> {\n if (!hasGlobPattern(pattern)) {\n return [path.resolve(pattern)];\n }\n\n const paths = new Set<string>();\n for await (const file of glob(pattern)) {\n paths.add(path.resolve(file));\n }\n\n const baseDir = globBaseDir(pattern);\n if (fs.existsSync(baseDir) && fs.statSync(baseDir).isDirectory()) {\n paths.add(baseDir);\n }\n return [...paths];\n}\n\nasync function resolveWatchPathsFromConfig(\n config: LoadedConfig,\n results: ErdBuildResult[],\n): Promise<string[]> {\n const paths = new Set<string>();\n for (const pattern of getWatchPatterns(config, results)) {\n for (const watchPath of await expandWatchPattern(pattern)) {\n paths.add(watchPath);\n }\n }\n return [...paths];\n}\n\nexport async function resolveWatchPaths(\n context: LocalErdSchemaContext,\n results: ErdBuildResult[],\n): Promise<string[]> {\n return await resolveWatchPathsFromConfig(context.config, results);\n}\n\nfunction parseFreshErdExportResults(stdout: string): ErdBuildResult[] {\n const lines = stdout\n .trim()\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n for (const line of lines.toReversed()) {\n try {\n const parsed = JSON.parse(line) as unknown;\n if (!Array.isArray(parsed)) continue;\n return parsed.map((entry): ErdBuildResult => {\n const result = entry as Partial<ErdExportJsonResult>;\n if (typeof result.namespace !== \"string\" || typeof result.distDir !== \"string\") {\n throw new Error(\"Invalid ERD export JSON output.\");\n }\n return {\n namespace: result.namespace,\n distDir: result.distDir,\n };\n });\n } catch {\n continue;\n }\n }\n throw new Error(\"Failed to parse ERD export JSON output.\");\n}\n\nfunction freshErdExportArgs(options: FreshErdExportOptions): string[] {\n const cliEntry = process.argv[1];\n if (!cliEntry) {\n throw new Error(\"Cannot rebuild ERD schema in a fresh process: CLI entrypoint is unavailable.\");\n }\n\n const args = [cliEntry, \"tailordb\", \"erd\", \"export\", \"--output\", options.outputDir, \"--json\"];\n if (options.configPath) {\n args.push(\"--config\", options.configPath);\n }\n if (options.namespace) {\n args.push(\"--namespace\", options.namespace);\n }\n return args;\n}\n\nasync function runFreshErdExport(options: FreshErdExportOptions): Promise<ErdBuildResult[]> {\n return await new Promise<ErdBuildResult[]>((resolve, reject) => {\n const child = spawn(process.execPath, freshErdExportArgs(options), {\n cwd: process.cwd(),\n env: process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n let stdout = \"\";\n let stderr = \"\";\n child.stdout.setEncoding(\"utf8\");\n child.stderr.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n child.stderr.on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n child.on(\"error\", reject);\n child.on(\"close\", (code, signal) => {\n if (code !== 0) {\n const detail = stderr.trim() || signal || `exit code ${code}`;\n reject(new Error(`Fresh ERD export failed: ${detail}`));\n return;\n }\n try {\n resolve(parseFreshErdExportResults(stdout));\n } catch (error) {\n reject(error);\n }\n });\n });\n}\n\nfunction selectPrimaryResult(results: ErdBuildResult[]): ErdBuildResult {\n const [primary, ...rest] = results;\n if (!primary) {\n throw new Error(\"No ERD build results found.\");\n }\n\n logger.info(`Serving ERD for namespace \"${primary.namespace}\".`);\n if (rest.length > 0) {\n const commands = rest.map((result) => ` - ${formatServeCommand(result.namespace)}`).join(\"\\n\");\n logger.warn(`Multiple namespaces found. To serve another namespace, run:\\n${commands}`);\n }\n\n return primary;\n}\n\nasync function createErdWatcher(options: WatchOptions): Promise<FSWatcher> {\n let rebuilding = false;\n let pending = false;\n let watchPaths = await resolveWatchPaths(options.initialContext, options.initialResults);\n let importNonce = 0;\n\n const watcher = watch(watchPaths, {\n ignored: /node_modules/,\n ignoreInitial: true,\n awaitWriteFinish: {\n stabilityThreshold: 100,\n pollInterval: 100,\n },\n });\n\n async function rebuild(): Promise<void> {\n if (rebuilding) {\n pending = true;\n return;\n }\n\n rebuilding = true;\n try {\n const results = await runFreshErdExport({\n configPath: options.configPath,\n namespace: options.namespace,\n outputDir: options.outputDir,\n });\n const { config } = await loadConfig(options.configPath, {\n importNonce: String((importNonce += 1)),\n });\n const nextWatchPaths = await resolveWatchPathsFromConfig(config, results);\n watcher.unwatch(watchPaths);\n watcher.add(nextWatchPaths);\n watchPaths = nextWatchPaths;\n logger.success(\n `Rebuilt ERD schema (${results.map((result) => result.namespace).join(\", \")})`,\n {\n mode: \"stream\",\n },\n );\n } catch (error) {\n logger.error(\"Failed to rebuild ERD schema. Serving the last successful build.\", {\n mode: \"stream\",\n });\n logger.error(String(error));\n } finally {\n rebuilding = false;\n if (pending) {\n pending = false;\n await rebuild();\n }\n }\n }\n\n let debounceTimer: NodeJS.Timeout | undefined;\n const scheduleRebuild = (changedPath: string) => {\n logger.info(`Schema source changed: ${path.relative(process.cwd(), changedPath)}`, {\n mode: \"stream\",\n });\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n debounceTimer = setTimeout(() => {\n rebuild();\n }, 150);\n };\n\n watcher.on(\"add\", scheduleRebuild);\n watcher.on(\"change\", scheduleRebuild);\n watcher.on(\"unlink\", scheduleRebuild);\n watcher.on(\"error\", (error) => {\n logger.error(`ERD watcher error: ${String(error)}`, { mode: \"stream\" });\n });\n\n return watcher;\n}\n\nasync function waitForShutdown(server: http.Server, watcher: FSWatcher): Promise<void> {\n return await new Promise<void>((resolve) => {\n const shutdown = () => {\n watcher.close().finally(() => {\n server.close(() => {\n logger.info(\"ERD server stopped.\");\n resolve();\n });\n });\n };\n\n process.once(\"SIGINT\", shutdown);\n process.once(\"SIGTERM\", shutdown);\n });\n}\n\nexport const erdServeCommand = defineAppCommand({\n name: \"serve\",\n description: \"Generate and serve TailorDB ERD locally with watch reload. (beta)\",\n args: z\n .object({\n ...configArg,\n namespace: arg(z.string().optional(), {\n alias: \"n\",\n description: \"TailorDB namespace name (uses first namespace in config if not specified)\",\n }),\n port: arg(z.coerce.number().int().min(0).max(65535).default(0), {\n description: \"Local server port (0 selects a free port)\",\n }),\n open: arg(z.boolean().default(false), {\n description: \"Open the ERD viewer in the default browser\",\n }),\n })\n .strict(),\n run: async (args) => {\n initErdCommand();\n\n const outputDir = path.resolve(process.cwd(), DEFAULT_ERD_BASE_DIR);\n const context = await loadLocalErdSchema({\n configPath: args.config,\n namespaces: args.namespace ? [args.namespace] : undefined,\n });\n const results = prepareErdBuildsFromContext({\n context,\n namespace: args.namespace,\n outputDir,\n });\n const primary = selectPrimaryResult(results);\n const { server, url } = await startStaticServer({\n distDir: primary.distDir,\n port: args.port,\n });\n const watchUrl = `${url}/?watch=1`;\n const watcher = await createErdWatcher({\n configPath: args.config,\n namespace: args.namespace,\n outputDir,\n initialContext: context,\n initialResults: results,\n });\n\n logger.newline();\n if (args.json) {\n logger.out({\n namespace: primary.namespace,\n url: watchUrl,\n distDir: primary.distDir,\n });\n } else {\n logger.success(\"ERD server started.\");\n logger.out(watchUrl);\n }\n\n if (args.open) {\n try {\n await open(watchUrl);\n } catch {\n logger.warn(\"Failed to open browser automatically. Please open the URL above manually.\");\n }\n }\n\n await waitForShutdown(server, watcher);\n },\n});\n","import { defineCommand } from \"politty\";\nimport { erdDeployCommand } from \"./deploy\";\nimport { erdExportCommand } from \"./export\";\nimport { erdServeCommand } from \"./serve\";\n\nexport const erdCommand = defineCommand({\n name: \"erd\",\n description: \"Generate TailorDB ERD viewer artifacts from local TailorDB schema. (beta)\",\n subCommands: {\n export: erdExportCommand,\n serve: erdServeCommand,\n deploy: erdDeployCommand,\n },\n});\n","/**\n * Script command for TailorDB migrations\n *\n * Adds a `migrate.ts` (and supporting `db.ts`) template to an existing\n * migration directory. Useful for warning-tier changes where users may\n * want to write a custom data migration even though the change does not\n * automatically require one.\n */\n\nimport * as fs from \"node:fs\";\nimport * as fsPromises from \"node:fs/promises\";\nimport * as path from \"pathe\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { configArg } from \"@/cli/shared/args\";\nimport { logBetaWarning } from \"@/cli/shared/beta\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadConfig } from \"@/cli/shared/config-loader\";\nimport { getConfiguredEditorCommand, openInConfiguredEditor } from \"@/cli/shared/editor\";\nimport { logger, styles } from \"@/cli/shared/logger\";\nimport { getNamespacesWithMigrations, type NamespaceWithMigrations } from \"./config\";\nimport { writeDbTypesFile } from \"./db-types-generator\";\nimport {\n getMigrationFilePath,\n isValidMigrationNumber,\n loadDiff,\n reconstructSnapshotFromMigrations,\n INITIAL_SCHEMA_NUMBER,\n} from \"./snapshot\";\nimport { generateMigrationScript } from \"./template-generator\";\n\nexport interface ScriptOptions {\n configPath?: string;\n number: string;\n namespace?: string;\n}\n\n/**\n * Add a migrate.ts template to an existing migration directory.\n * @param {ScriptOptions} options - Command options\n */\nasync function script(options: ScriptOptions): Promise<void> {\n logBetaWarning(\"tailordb migration\");\n\n // Accept either the canonical 4-digit form (\"0001\") or a bare integer\n // (\"1\"–\"9999\"). Reject inputs containing non-digit characters, integer\n // forms with leading zeros (\"00001\"), and anything outside the\n // 0000-9999 directory range that the migrations system supports.\n let migrationNumber: number;\n if (isValidMigrationNumber(options.number)) {\n migrationNumber = parseInt(options.number, 10);\n } else if (/^[1-9]\\d*$/.test(options.number)) {\n migrationNumber = parseInt(options.number, 10);\n if (migrationNumber > 9999) {\n throw new Error(`Migration number ${options.number} is out of range. Expected 1-9999.`);\n }\n } else {\n throw new Error(\n `Invalid migration number format: ${options.number}. Expected 4-digit format (e.g., 0001) or integer 1-9999 (e.g., 1).`,\n );\n }\n\n if (migrationNumber === INITIAL_SCHEMA_NUMBER) {\n throw new Error(\n `Migration ${options.number} is the initial schema snapshot and cannot have a migration script.`,\n );\n }\n\n const { config } = await loadConfig(options.configPath);\n const configDir = path.dirname(config.path);\n\n const namespacesWithMigrations = getNamespacesWithMigrations(config, configDir);\n if (namespacesWithMigrations.length === 0) {\n throw new Error(\"No TailorDB services with migrations configuration found\");\n }\n\n const targetNamespace = resolveTargetNamespace(namespacesWithMigrations, options.namespace);\n const { migrationsDir } = namespacesWithMigrations.find(\n (ns) => ns.namespace === targetNamespace,\n )!;\n\n const diffPath = getMigrationFilePath(migrationsDir, migrationNumber, \"diff\");\n if (!fs.existsSync(diffPath)) {\n throw new Error(\n `Migration ${options.number} not found in ${migrationsDir}. Expected ${diffPath}.`,\n );\n }\n\n const migratePath = getMigrationFilePath(migrationsDir, migrationNumber, \"migrate\");\n if (fs.existsSync(migratePath)) {\n throw new Error(`Migration script already exists at ${migratePath}.`);\n }\n\n const diff = loadDiff(diffPath);\n\n // Reconstruct the schema state immediately before this migration so that\n // db.ts has Kysely types for the previous shape of the data.\n const previousSnapshot = reconstructSnapshotFromMigrations(migrationsDir, migrationNumber - 1);\n if (!previousSnapshot) {\n throw new Error(\n `Could not reconstruct previous schema for migration ${options.number}. Make sure migration ${INITIAL_SCHEMA_NUMBER} exists.`,\n );\n }\n\n const scriptContent = generateMigrationScript(diff);\n await fsPromises.writeFile(migratePath, scriptContent);\n await writeDbTypesFile(previousSnapshot, migrationsDir, migrationNumber, diff);\n\n logger.success(\n `Added migration script for migration ${styles.bold(options.number)} in namespace ${styles.bold(targetNamespace)}`,\n );\n logger.info(` Migration script: ${migratePath}`);\n logger.info(` DB types: ${getMigrationFilePath(migrationsDir, migrationNumber, \"db\")}`);\n\n logger.newline();\n logger.log(\"Edit the script to implement your data migration logic.\");\n logger.log(\"It will be executed by 'tailor-sdk deploy' between Pre and Post phases.\");\n\n const editor = getConfiguredEditorCommand();\n if (!editor) return;\n\n logger.newline();\n logger.info(`Opening ${path.basename(migratePath)} in ${editor}...`);\n try {\n await openInConfiguredEditor(migratePath);\n } catch {\n return;\n }\n}\n\nfunction resolveTargetNamespace(\n namespacesWithMigrations: NamespaceWithMigrations[],\n requested?: string,\n): string {\n if (requested) {\n if (!namespacesWithMigrations.some((ns) => ns.namespace === requested)) {\n throw new Error(`Namespace \"${requested}\" not found or does not have migrations configured`);\n }\n return requested;\n }\n if (namespacesWithMigrations.length === 1) {\n return namespacesWithMigrations[0].namespace;\n }\n throw new Error(\n `Multiple TailorDB services found. Please specify namespace with --namespace flag: ${namespacesWithMigrations.map((ns) => ns.namespace).join(\", \")}`,\n );\n}\n\nexport const scriptCommand = defineAppCommand({\n name: \"script\",\n description: \"Add a migration script (migrate.ts) template to an existing migration directory.\",\n args: z\n .object({\n ...configArg,\n number: arg(z.string(), {\n positional: true,\n description: \"Migration number to add a script to (e.g., 0001 or 1)\",\n }),\n namespace: arg(z.string().optional(), {\n alias: \"n\",\n description: \"Target TailorDB namespace (required if multiple namespaces exist)\",\n }),\n })\n .strict(),\n run: async (args) => {\n await script({\n configPath: args.config,\n number: args.number,\n namespace: args.namespace,\n });\n },\n});\n","import * as path from \"pathe\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { resourceTrn } from \"@/cli/commands/deploy/label\";\nimport { confirmationArgs, deploymentArgs } from \"@/cli/shared/args\";\nimport { logBetaWarning } from \"@/cli/shared/beta\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadConfig } from \"@/cli/shared/config-loader\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger, styles } from \"@/cli/shared/logger\";\nimport { prompt } from \"@/cli/shared/prompt\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport { getNamespacesWithMigrations } from \"./config\";\nimport { formatMigrationNumber, isValidMigrationNumber } from \"./snapshot\";\nimport { parseMigrationLabelNumber } from \"./types\";\n\nexport interface SetOptions {\n configPath?: string;\n number: string;\n namespace?: string;\n yes?: boolean;\n workspaceId?: string;\n profile?: string;\n}\n\n/**\n * Set migration checkpoint for a TailorDB namespace\n * @param {SetOptions} options - Command options\n */\nasync function set(options: SetOptions): Promise<void> {\n logBetaWarning(\"tailordb migration\");\n\n // 1. Validate migration number format\n const numberStr = options.number;\n\n // Accept either 4-digit format (0001) or integer (1)\n let migrationNumber: number;\n if (isValidMigrationNumber(numberStr)) {\n // 4-digit format\n migrationNumber = parseInt(numberStr, 10);\n } else {\n // Try parsing as integer\n migrationNumber = parseInt(numberStr, 10);\n if (isNaN(migrationNumber) || migrationNumber < 0) {\n throw new Error(\n `Invalid migration number format: ${numberStr}. Expected 4-digit format (e.g., 0001) or integer (e.g., 1).`,\n );\n }\n }\n\n // 2. Load configuration\n const { config } = await loadConfig(options.configPath);\n const configDir = path.dirname(config.path);\n\n // 3. Get namespaces with migrations\n const namespacesWithMigrations = getNamespacesWithMigrations(config, configDir);\n\n if (namespacesWithMigrations.length === 0) {\n throw new Error(\"No TailorDB services with migrations configuration found\");\n }\n\n // 4. Determine target namespace\n let targetNamespace: string;\n if (options.namespace) {\n if (!namespacesWithMigrations.some((ns) => ns.namespace === options.namespace)) {\n throw new Error(\n `Namespace \"${options.namespace}\" not found or does not have migrations configured`,\n );\n }\n targetNamespace = options.namespace;\n } else if (namespacesWithMigrations.length === 1) {\n targetNamespace = namespacesWithMigrations[0].namespace;\n } else {\n throw new Error(\n `Multiple TailorDB services found. Please specify namespace with --namespace flag: ${namespacesWithMigrations.map((ns) => ns.namespace).join(\", \")}`,\n );\n }\n\n // 5. Initialize client\n const accessToken = await loadAccessToken({\n useProfile: false,\n profile: options.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: options.workspaceId,\n profile: options.profile,\n });\n\n // 6. Get current migration number\n const trn = resourceTrn(workspaceId, \"tailordb\", targetNamespace);\n let currentMigration: number;\n try {\n const { metadata } = await client.getMetadata({ trn });\n const label = metadata?.labels?.[\"sdk-migration\"];\n currentMigration = label ? (parseMigrationLabelNumber(label) ?? 0) : 0;\n } catch {\n currentMigration = 0;\n }\n\n // 7. Display warning and confirmation\n logger.newline();\n logger.warn(\"This operation will change the migration checkpoint.\");\n logger.log(`Namespace: ${styles.bold(targetNamespace)}`);\n logger.log(`Current migration: ${styles.bold(formatMigrationNumber(currentMigration))}`);\n logger.log(`New migration: ${styles.bold(formatMigrationNumber(migrationNumber))}`);\n logger.newline();\n\n if (migrationNumber < currentMigration) {\n logger.warn(\n `Setting migration number backwards (${formatMigrationNumber(currentMigration)} → ${formatMigrationNumber(migrationNumber)}) will cause previous migrations to be re-executed on next apply.`,\n );\n logger.newline();\n } else if (migrationNumber > currentMigration) {\n logger.warn(\n `Setting migration number forwards (${formatMigrationNumber(currentMigration)} → ${formatMigrationNumber(migrationNumber)}) will skip migrations ${formatMigrationNumber(currentMigration + 1)} to ${formatMigrationNumber(migrationNumber)}.`,\n );\n logger.newline();\n }\n\n // 8. Confirmation prompt (unless --yes flag)\n if (!options.yes) {\n const confirmation = await prompt.confirm({\n message: \"Continue with migration checkpoint update?\",\n default: false,\n });\n\n if (!confirmation) {\n logger.info(\"Operation cancelled.\");\n return;\n }\n logger.newline();\n }\n\n // 9. Update migration label\n const { metadata } = await client.getMetadata({ trn });\n const existingLabels = metadata?.labels ?? {};\n\n await client.setMetadata({\n trn,\n labels: {\n ...existingLabels,\n \"sdk-migration\": `m${formatMigrationNumber(migrationNumber)}`,\n },\n });\n\n logger.success(\n `Migration checkpoint set to ${styles.bold(formatMigrationNumber(migrationNumber))} for namespace ${styles.bold(targetNamespace)}`,\n );\n}\n\nexport const setCommand = defineAppCommand({\n name: \"set\",\n description: \"Set migration checkpoint to a specific number.\",\n args: z\n .object({\n ...deploymentArgs,\n ...confirmationArgs,\n number: arg(z.string(), {\n positional: true,\n description: \"Migration number to set (e.g., 0001 or 1)\",\n }),\n namespace: arg(z.string().optional(), {\n alias: \"n\",\n description: \"Target TailorDB namespace (required if multiple namespaces exist)\",\n }),\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n await set({\n configPath: args.config,\n number: args.number,\n namespace: args.namespace,\n yes: args.yes,\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n },\n});\n","import * as fs from \"node:fs\";\nimport * as path from \"pathe\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { resourceTrn } from \"@/cli/commands/deploy/label\";\nimport { deploymentArgs } from \"@/cli/shared/args\";\nimport { logBetaWarning } from \"@/cli/shared/beta\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadConfig } from \"@/cli/shared/config-loader\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger, styles } from \"@/cli/shared/logger\";\nimport { getNamespacesWithMigrations } from \"./config\";\nimport {\n getMigrationFiles,\n loadDiff,\n getMigrationFilePath,\n formatMigrationNumber,\n} from \"./snapshot\";\nimport { parseMigrationLabelNumber } from \"./types\";\n\nexport interface StatusOptions {\n configPath?: string;\n namespace?: string;\n workspaceId?: string;\n profile?: string;\n json?: boolean;\n}\n\ninterface PendingMigrationStatusInfo {\n number: number;\n label: string;\n description?: string;\n}\n\ninterface MigrationStatusInfo {\n namespace: string;\n currentMigration: number;\n currentMigrationLabel: string;\n pendingMigrations: PendingMigrationStatusInfo[];\n}\n\nasync function collectMigrationStatuses(options: StatusOptions): Promise<MigrationStatusInfo[]> {\n const { config } = await loadConfig(options.configPath);\n const configDir = path.dirname(config.path);\n\n const namespacesWithMigrations = getNamespacesWithMigrations(config, configDir);\n\n if (namespacesWithMigrations.length === 0) {\n throw new Error(\"No TailorDB services with migrations configuration found\");\n }\n\n const targetNamespaces = options.namespace\n ? namespacesWithMigrations.filter((ns) => ns.namespace === options.namespace)\n : namespacesWithMigrations;\n\n if (targetNamespaces.length === 0) {\n throw new Error(\n `Namespace \"${options.namespace}\" not found or does not have migrations configured`,\n );\n }\n\n const accessToken = await loadAccessToken({\n useProfile: false,\n profile: options.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: options.workspaceId,\n profile: options.profile,\n });\n\n const statuses: MigrationStatusInfo[] = [];\n\n for (const { namespace, migrationsDir } of targetNamespaces) {\n const trn = resourceTrn(workspaceId, \"tailordb\", namespace);\n let currentMigration: number;\n try {\n const { metadata } = await client.getMetadata({ trn });\n const label = metadata?.labels?.[\"sdk-migration\"];\n currentMigration = label ? (parseMigrationLabelNumber(label) ?? 0) : 0;\n } catch {\n currentMigration = 0;\n }\n\n const migrationFiles = getMigrationFiles(migrationsDir);\n const availableNumbers = migrationFiles\n .map((f) => f.number)\n .filter((n, i, arr) => arr.indexOf(n) === i) // deduplicate\n .sort((a, b) => a - b);\n const pendingNumbers = availableNumbers.filter((n) => n > currentMigration);\n\n const pendingMigrations = pendingNumbers.map((num) => {\n const diffPath = getMigrationFilePath(migrationsDir, num, \"diff\");\n let description: string | undefined;\n\n if (fs.existsSync(diffPath)) {\n try {\n const diff = loadDiff(diffPath);\n description = diff.description;\n } catch {\n // Ignore errors loading diff\n }\n }\n\n return {\n number: num,\n label: formatMigrationNumber(num),\n ...(description ? { description } : {}),\n };\n });\n\n statuses.push({\n namespace,\n currentMigration,\n currentMigrationLabel: formatMigrationNumber(currentMigration),\n pendingMigrations,\n });\n }\n\n return statuses;\n}\n\nfunction printMigrationStatuses(statuses: MigrationStatusInfo[]): void {\n for (const statusInfo of statuses) {\n logger.newline();\n logger.info(`Namespace: ${styles.bold(statusInfo.namespace)}`);\n logger.log(` Current migration: ${styles.bold(statusInfo.currentMigrationLabel)}`);\n\n if (statusInfo.pendingMigrations.length > 0) {\n logger.log(\" Pending migrations:\");\n for (const pending of statusInfo.pendingMigrations) {\n if (pending.description) {\n logger.log(` - ${pending.label}: ${pending.description}`);\n } else {\n logger.log(` - ${pending.label}`);\n }\n }\n } else {\n logger.log(\" Pending migrations: (none)\");\n }\n }\n\n logger.newline();\n}\n\n/**\n * Show migration status for TailorDB namespaces\n * @param {StatusOptions} options - Command options\n */\nasync function status(options: StatusOptions): Promise<void> {\n logBetaWarning(\"tailordb migration\");\n\n const statuses = await collectMigrationStatuses(options);\n if (options.json) {\n logger.out(statuses);\n return;\n }\n\n printMigrationStatuses(statuses);\n}\n\nexport const statusCommand = defineAppCommand({\n name: \"status\",\n description:\n \"Show the current migration status for TailorDB namespaces, including applied and pending migrations.\",\n args: z\n .object({\n ...deploymentArgs,\n namespace: arg(z.string().optional(), {\n alias: \"n\",\n description: \"Target TailorDB namespace (shows all namespaces if not specified)\",\n }),\n })\n .strict(),\n run: async (args) => {\n await status({\n configPath: args.config,\n namespace: args.namespace,\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n json: logger.jsonMode,\n });\n },\n});\n","/**\n * TailorDB migration command\n *\n * Subcommands:\n * - generate: Generate migration files from schema differences\n * - script: Add a migrate.ts template to an existing migration\n * - set: Set migration checkpoint to a specific number\n * - status: Show migration status for TailorDB namespaces\n */\n\nimport { defineCommand } from \"politty\";\nimport { generateCommand } from \"./generate\";\nimport { scriptCommand } from \"./script\";\nimport { setCommand } from \"./set\";\nimport { statusCommand } from \"./status\";\n\nexport const migrationCommand = defineCommand({\n name: \"migration\",\n description: \"Manage TailorDB schema migrations.\",\n subCommands: {\n generate: generateCommand,\n script: scriptCommand,\n set: setCommand,\n status: statusCommand,\n },\n});\n\nexport { generateCommand } from \"./generate\";\nexport type { GenerateOptions } from \"./generate\";\nexport { scriptCommand } from \"./script\";\nexport type { ScriptOptions } from \"./script\";\nexport { setCommand } from \"./set\";\nexport type { SetOptions } from \"./set\";\nexport { statusCommand } from \"./status\";\nexport type { StatusOptions } from \"./status\";\n","import { defineCommand } from \"politty\";\nimport { erdCommand } from \"./erd\";\nimport { migrationCommand } from \"./migrate\";\nimport { truncateCommand } from \"./truncate\";\n\nexport const tailordbCommand = defineCommand({\n name: \"tailordb\",\n description: \"Manage TailorDB tables and data.\",\n subCommands: {\n truncate: truncateCommand,\n migration: migrationCommand,\n erd: erdCommand,\n },\n});\n","import * as path from \"pathe\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\n\nexport const upgradeCommand = defineAppCommand({\n name: \"upgrade\",\n description: \"Run codemods to upgrade your project to a newer SDK version.\",\n args: z\n .object({\n from: arg(z.string(), {\n description: \"SDK version before the upgrade (e.g., 1.33.0)\",\n }),\n \"dry-run\": arg(z.boolean().default(false), {\n alias: \"d\",\n description: \"Preview changes without modifying files\",\n }),\n path: arg(z.string().default(\".\"), {\n description: \"Project directory to upgrade\",\n completion: { type: \"directory\" },\n }),\n })\n .strict(),\n run: async (args) => {\n const { initTelemetry } = await import(\"@/cli/telemetry\");\n await initTelemetry();\n\n const { upgrade } = await import(\"./service\");\n await upgrade({\n from: args.from,\n dryRun: args[\"dry-run\"],\n path: path.resolve(args.path),\n });\n },\n});\n","import { z } from \"zod\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { readPlatformConfig } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport ml from \"@/utils/multiline\";\n\nexport const currentCommand = defineAppCommand({\n name: \"current\",\n description: \"Show current user.\",\n args: z.object({}).strict(),\n run: async () => {\n const config = await readPlatformConfig();\n const jsonOutput = logger.jsonMode;\n\n // Check if current user is set\n if (!config.current_user) {\n throw new Error(ml`\n Current user not set.\n Please login first using 'tailor-sdk login' command to register a user.\n `);\n }\n\n // Check if user exists\n if (!config.users[config.current_user]) {\n throw new Error(ml`\n Current user '${config.current_user}' not found in registered users.\n Please login again using 'tailor-sdk login' command to register the user.\n `);\n }\n\n if (jsonOutput) {\n logger.out({ user: config.current_user });\n return;\n }\n\n logger.out(config.current_user);\n },\n});\n","import { z } from \"zod\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { readPlatformConfig } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport ml from \"@/utils/multiline\";\n\nexport const listCommand = defineAppCommand({\n name: \"list\",\n description: \"List all users.\",\n args: z.object({}).strict(),\n run: async () => {\n const config = await readPlatformConfig();\n const jsonOutput = logger.jsonMode;\n\n const users = Object.keys(config.users);\n if (users.length === 0) {\n logger.info(ml`\n No users found.\n Please login first using 'tailor-sdk login' command to register a user.\n `);\n if (jsonOutput) {\n logger.out([]);\n }\n return;\n }\n\n if (jsonOutput) {\n logger.out(users);\n return;\n }\n\n users.forEach((user) => {\n if (user === config.current_user) {\n logger.success(`${user} (current)`, { mode: \"plain\" });\n } else {\n logger.log(user);\n }\n });\n },\n});\n","import { PATScope } from \"@tailor-proto/tailor/v1/auth_resource_pb\";\nimport { logger } from \"@/cli/shared/logger\";\nimport ml from \"@/utils/multiline\";\nimport type { PersonalAccessToken } from \"@tailor-proto/tailor/v1/auth_resource_pb\";\n\nexport interface PersonalAccessTokenInfo {\n name: string;\n scopes: string[];\n}\n\nfunction patScopeToString(scope: PATScope): string {\n switch (scope) {\n case PATScope.PAT_SCOPE_READ:\n return \"read\";\n case PATScope.PAT_SCOPE_WRITE:\n return \"write\";\n default:\n return \"unknown\";\n }\n}\n\n/**\n * Transform a PersonalAccessToken into CLI-friendly info.\n * @param pat - Personal access token resource\n * @returns Flattened token info\n */\nexport function transformPersonalAccessToken(pat: PersonalAccessToken): PersonalAccessTokenInfo {\n return {\n name: pat.name,\n scopes: pat.scopes.map(patScopeToString),\n };\n}\n\n/**\n * Get PAT scopes from a write flag.\n * @param write - Whether write access is required\n * @returns Scopes to apply to the token\n */\nexport function getScopesFromWriteFlag(write: boolean): PATScope[] {\n return write ? [PATScope.PAT_SCOPE_READ, PATScope.PAT_SCOPE_WRITE] : [PATScope.PAT_SCOPE_READ];\n}\n\nfunction getScopeStringsFromWriteFlag(write: boolean): string[] {\n return write ? [\"read\", \"write\"] : [\"read\"];\n}\n\n/**\n * Print the created or updated personal access token to the logger.\n * @param name - Token name\n * @param token - Token value\n * @param write - Whether the token has write scope\n * @param action - Action performed\n */\nexport function printCreatedToken(\n name: string,\n token: string,\n write: boolean,\n action: \"created\" | \"updated\",\n): void {\n const scopes = getScopeStringsFromWriteFlag(write);\n\n if (logger.jsonMode) {\n logger.out({ name, scopes, token });\n } else {\n logger.log(ml`\n Personal access token ${action} successfully.\n\n name: ${name}\n scopes: ${scopes.join(\"/\")}\n token: ${token}\n\n Please save this token in a secure location. You won't be able to see it again.\n `);\n }\n}\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { fetchLatestToken, readPlatformConfig } from \"@/cli/shared/context\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport ml from \"@/utils/multiline\";\nimport { getScopesFromWriteFlag, printCreatedToken } from \"./transform\";\n\nexport const createCommand = defineAppCommand({\n name: \"create\",\n description: \"Create a new personal access token.\",\n args: z\n .object({\n name: arg(z.string(), {\n positional: true,\n description: \"Token name\",\n }),\n write: arg(z.boolean().default(false), {\n alias: \"W\",\n description: \"Grant write permission (default: read-only)\",\n }),\n })\n .strict(),\n run: async (args) => {\n await assertWritable();\n const config = await readPlatformConfig();\n\n if (!config.current_user) {\n throw new Error(ml`\n No user logged in.\n Please login first using 'tailor-sdk login' command.\n `);\n }\n\n const token = await fetchLatestToken(config, config.current_user);\n const client = await initOperatorClient(token);\n\n const scopes = getScopesFromWriteFlag(args.write);\n const result = await client.createPersonalAccessToken({\n name: args.name,\n scopes,\n });\n\n if (!result.accessToken) {\n throw new Error(\"Failed to create personal access token\");\n }\n\n printCreatedToken(args.name, result.accessToken, args.write, \"created\");\n },\n});\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { fetchLatestToken, readPlatformConfig } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport ml from \"@/utils/multiline\";\n\nexport const deleteCommand = defineAppCommand({\n name: \"delete\",\n description: \"Delete a personal access token.\",\n args: z\n .object({\n name: arg(z.string(), {\n positional: true,\n description: \"Token name\",\n }),\n })\n .strict(),\n run: async (args) => {\n await assertWritable();\n const config = await readPlatformConfig();\n\n if (!config.current_user) {\n throw new Error(ml`\n No user logged in.\n Please login first using 'tailor-sdk login' command.\n `);\n }\n\n const token = await fetchLatestToken(config, config.current_user);\n const client = await initOperatorClient(token);\n\n await client.deletePersonalAccessToken({\n name: args.name,\n });\n\n logger.success(`Personal access token \"${args.name}\" deleted successfully.`);\n },\n});\n","import { z } from \"zod\";\nimport { paginationArgs, toPageDirection } from \"@/cli/shared/args\";\nimport { fetchPaged, initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { fetchLatestToken, readPlatformConfig } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport ml from \"@/utils/multiline\";\nimport { transformPersonalAccessToken, type PersonalAccessTokenInfo } from \"./transform\";\n\nexport const listCommand = defineAppCommand({\n name: \"list\",\n description: \"List all personal access tokens.\",\n args: z.object({ ...paginationArgs() }).strict(),\n run: async (args) => {\n const jsonOutput = logger.jsonMode;\n const config = await readPlatformConfig();\n\n if (!config.current_user) {\n throw new Error(ml`\n No user logged in.\n Please login first using 'tailor-sdk login' command.\n `);\n }\n\n const token = await fetchLatestToken(config, config.current_user);\n const client = await initOperatorClient(token);\n\n const pageDirection = toPageDirection(args.order);\n const pats = await fetchPaged(\n async (pageToken, pageSize) => {\n const { personalAccessTokens, nextPageToken } = await client.listPersonalAccessTokens({\n pageToken,\n pageSize,\n pageDirection,\n });\n return [personalAccessTokens, nextPageToken];\n },\n { limit: args.limit },\n );\n\n if (pats.length === 0) {\n logger.info(ml`\n No personal access tokens found.\n Please create a token using 'tailor-sdk user pat create' command.\n `);\n if (!jsonOutput) {\n return;\n }\n }\n\n const patInfos: PersonalAccessTokenInfo[] = pats.map(transformPersonalAccessToken);\n if (jsonOutput) {\n logger.out(patInfos);\n return;\n }\n\n // Text format: aligned list \"name: scope1/scope2\"\n const maxNameLength = Math.max(...pats.map((pat) => pat.name.length));\n\n pats.forEach((pat) => {\n const info = transformPersonalAccessToken(pat);\n const paddedName = info.name.padStart(maxNameLength);\n logger.log(`${paddedName}: ${info.scopes.join(\"/\")}`);\n });\n },\n});\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { fetchLatestToken, readPlatformConfig } from \"@/cli/shared/context\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport ml from \"@/utils/multiline\";\nimport { getScopesFromWriteFlag, printCreatedToken } from \"./transform\";\n\nexport const updateCommand = defineAppCommand({\n name: \"update\",\n description: \"Update a personal access token (delete and recreate).\",\n args: z\n .object({\n name: arg(z.string(), {\n positional: true,\n description: \"Token name\",\n }),\n write: arg(z.boolean().default(false), {\n alias: \"W\",\n description: \"Grant write permission (if not specified, keeps read-only)\",\n }),\n })\n .strict(),\n run: async (args) => {\n await assertWritable();\n const config = await readPlatformConfig();\n\n if (!config.current_user) {\n throw new Error(ml`\n No user logged in.\n Please login first using 'tailor-sdk login' command.\n `);\n }\n\n const token = await fetchLatestToken(config, config.current_user);\n const client = await initOperatorClient(token);\n\n // Delete the existing token\n await client.deletePersonalAccessToken({\n name: args.name,\n });\n\n // Create a new token with the same name\n const scopes = getScopesFromWriteFlag(args.write);\n const result = await client.createPersonalAccessToken({\n name: args.name,\n scopes,\n });\n\n if (!result.accessToken) {\n throw new Error(\"Failed to create personal access token\");\n }\n\n printCreatedToken(args.name, result.accessToken, args.write, \"updated\");\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { createCommand } from \"./create\";\nimport { deleteCommand } from \"./delete\";\nimport { listCommand } from \"./list\";\nimport { updateCommand } from \"./update\";\n\nexport const patCommand = defineCommand({\n name: \"pat\",\n description: \"Manage personal access tokens.\",\n subCommands: {\n list: listCommand,\n create: createCommand,\n delete: deleteCommand,\n update: updateCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { readPlatformConfig, writePlatformConfig } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport ml from \"@/utils/multiline\";\n\nexport const switchCommand = defineAppCommand({\n name: \"switch\",\n description: \"Set current user.\",\n args: z\n .object({\n user: arg(z.string(), {\n positional: true,\n description: \"User email\",\n }),\n })\n .strict(),\n run: async (args) => {\n const config = await readPlatformConfig();\n\n // Check if user exists\n if (!config.users[args.user]) {\n throw new Error(ml`\n User \"${args.user}\" not found.\n Please login first using 'tailor-sdk login' command to register this user.\n `);\n }\n\n // Set current user\n config.current_user = args.user;\n writePlatformConfig(config);\n\n logger.success(`Current user set to \"${args.user}\" successfully.`);\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { currentCommand } from \"./current\";\nimport { listCommand } from \"./list\";\nimport { patCommand } from \"./pat\";\nimport { switchCommand } from \"./switch\";\n\nexport const userCommand = defineCommand({\n name: \"user\",\n description: \"Manage Tailor Platform users.\",\n subCommands: {\n current: currentCommand,\n list: listCommand,\n switch: switchCommand,\n pat: patCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { executionsCommand } from \"./executions\";\nimport { getCommand } from \"./get\";\nimport { listCommand } from \"./list\";\nimport { resumeCommand } from \"./resume\";\nimport { startCommand } from \"./start\";\n\nexport const workflowCommand = defineCommand({\n name: \"workflow\",\n description: \"Manage workflows and workflow executions.\",\n subCommands: {\n list: listCommand,\n get: getCommand,\n start: startCommand,\n executions: executionsCommand,\n resume: resumeCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { healthCommand } from \"./health\";\nimport { listCommand } from \"./list\";\n\nexport const appCommand = defineCommand({\n name: \"app\",\n description: \"Manage workspace applications\",\n subCommands: {\n health: healthCommand,\n list: listCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { inviteCommand } from \"./invite\";\nimport { listCommand } from \"./list\";\nimport { removeCommand } from \"./remove\";\nimport { updateCommand } from \"./update\";\n\nexport const userCommand = defineCommand({\n name: \"user\",\n description: \"Manage workspace users\",\n subCommands: {\n invite: inviteCommand,\n list: listCommand,\n remove: removeCommand,\n update: updateCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { appCommand } from \"./app\";\nimport { createCommand } from \"./create\";\nimport { deleteCommand } from \"./delete\";\nimport { getCommand } from \"./get\";\nimport { listCommand } from \"./list\";\nimport { restoreCommand } from \"./restore\";\nimport { userCommand } from \"./user\";\n\nexport const workspaceCommand = defineCommand({\n name: \"workspace\",\n description: \"Manage Tailor Platform workspaces.\",\n subCommands: {\n app: appCommand,\n create: createCommand,\n delete: deleteCommand,\n get: getCommand,\n list: listCommand,\n restore: restoreCommand,\n user: userCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","#!/usr/bin/env node\n\nimport { defineCommand, runMain } from \"politty\";\nimport { withCompletionCommand } from \"politty/completion\";\nimport { z } from \"zod\";\nimport { apiCommand } from \"./commands/api\";\nimport { authconnectionCommand } from \"./commands/authconnection\";\nimport { crashReportCommand } from \"./commands/crashreport\";\nimport { deployCommand } from \"./commands/deploy\";\nimport { executorCommand } from \"./commands/executor\";\nimport { functionCommand } from \"./commands/function\";\nimport { generateCommand } from \"./commands/generate\";\nimport { initCommand } from \"./commands/init\";\nimport { loginCommand } from \"./commands/login\";\nimport { logoutCommand } from \"./commands/logout\";\nimport { machineuserCommand } from \"./commands/machineuser\";\nimport { oauth2clientCommand } from \"./commands/oauth2client\";\nimport { openCommand } from \"./commands/open\";\nimport { organizationCommand } from \"./commands/organization\";\nimport { profileCommand } from \"./commands/profile\";\nimport { removeCommand } from \"./commands/remove\";\nimport { secretCommand } from \"./commands/secret\";\nimport { setupCommand } from \"./commands/setup\";\nimport { showCommand } from \"./commands/show\";\nimport { skillsCommand } from \"./commands/skills\";\nimport { staticwebsiteCommand } from \"./commands/staticwebsite\";\nimport { tailordbCommand } from \"./commands/tailordb\";\nimport { upgradeCommand } from \"./commands/upgrade\";\nimport { userCommand } from \"./commands/user\";\nimport { workflowCommand } from \"./commands/workflow\";\nimport { workspaceCommand } from \"./commands/workspace\";\nimport { initCrashReporting } from \"./crashreport\";\nimport { queryCommand } from \"./query\";\nimport { commonArgs, isVerbose } from \"./shared/args\";\nimport { isCLIError } from \"./shared/errors\";\nimport { logger } from \"./shared/logger\";\nimport { readPackageJson } from \"./shared/package-json\";\nimport { isNativeTypeScriptRuntime } from \"./shared/runtime\";\n\n// Register tsx for TypeScript loading on Node.js.\n// Bun and Deno handle TypeScript natively, so registration is skipped.\n// tsx's own register() picks `module.registerHooks` on Node ≥ 24.11.1 / 25.1 / 26\n// (avoiding the DEP0205 deprecation) and falls back to `module.register` on older runtimes.\nif (!isNativeTypeScriptRuntime()) {\n const { register } = await import(\"tsx/esm/api\");\n register();\n}\n\n// Runs before globalArgs effects load --env-file, so env file overrides for\n// TAILOR_CRASH_REPORTS_* are not available for early startup failures.\n// This is intentional: we want crash reporting active before argument parsing,\n// and env files require parsing to be complete. Shell-level env vars still work.\ninitCrashReporting();\n\nconst packageJson = await readPackageJson();\nconst cliName = Object.keys(packageJson.bin ?? {})[0] || \"tailor-sdk\";\n\nexport const mainCommand = withCompletionCommand(\n defineCommand({\n name: cliName,\n description:\n packageJson.description || \"Tailor CLI for managing Tailor Platform SDK applications\",\n subCommands: {\n api: apiCommand,\n authconnection: authconnectionCommand,\n crashreport: crashReportCommand,\n deploy: deployCommand,\n executor: executorCommand,\n function: functionCommand,\n generate: generateCommand,\n init: initCommand,\n login: loginCommand,\n logout: logoutCommand,\n machineuser: machineuserCommand,\n oauth2client: oauth2clientCommand,\n open: openCommand,\n organization: organizationCommand,\n profile: profileCommand,\n query: queryCommand,\n remove: removeCommand,\n secret: secretCommand,\n setup: setupCommand,\n show: showCommand,\n skills: skillsCommand,\n staticwebsite: staticwebsiteCommand,\n tailordb: tailordbCommand,\n upgrade: upgradeCommand,\n user: userCommand,\n workflow: workflowCommand,\n workspace: workspaceCommand,\n },\n }),\n);\n\nrunMain(mainCommand, {\n version: packageJson.version,\n globalArgs: z.object(commonArgs),\n displayErrors: false,\n cleanup: async ({ error }) => {\n if (error) {\n if (isCLIError(error)) {\n logger.log(error.format());\n if (isVerbose() && error.stack) {\n logger.debug(`\\nStack trace:\\n${error.stack}`);\n }\n } else if (error instanceof Error) {\n logger.error(error.message);\n if (isVerbose() && error.stack) {\n logger.debug(`\\nStack trace:\\n${error.stack}`);\n }\n } else {\n logger.error(`Unknown error: ${error}`);\n }\n\n // Report programming bugs (native error types that indicate code defects).\n // Skip domain errors like ConnectError, CIPromptError, and plain Error\n // used for user-facing validation/not-found messages.\n // Exclude SyntaxError/ReferenceError: at runtime these typically come from\n // dynamically imported user config files, not from SDK code.\n const shouldReport =\n !isCLIError(error) &&\n (!(error instanceof Error) || error instanceof TypeError || error instanceof RangeError);\n if (shouldReport) {\n // Lazy import to match shutdownTelemetry pattern and keep cleanup handler lightweight.\n const { reportCrash } = await import(\"@/cli/crashreport\");\n await reportCrash(error, \"handledError\");\n }\n }\n const { shutdownTelemetry } = await import(\"@/cli/telemetry\");\n await shutdownTelemetry();\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["randomState","listCommand","fs","fs","listCommand","deployCommand","listCommand","getCommand","fs","getCommand","listCommand","detectPackageManager","listCommand","listCommand","getCommand","createCommand","deleteCommand","getCommand","listCommand","updateCommand","getCommand","listCommand","updateCommand","createCommand","deleteCommand","listCommand","updateCommand","createCommand","deleteCommand","listCommand","updateCommand","createCommand","deleteCommand","listCommand","createCommand","deleteCommand","listCommand","setupPnpm","setupYarn","setupNpm","setupBun","fs","deployTemplate","fs","setTimeout","mimeLookup","listCommand","listCommand","fs","DEFAULT_ERD_BASE_DIR","fs","lookupMime","fs","fs","generateCommand","listCommand","userCommand","listCommand","listCommand","getCommand","listCommand","listCommand","updateCommand","createCommand","deleteCommand","getCommand","listCommand","deployCommand","removeCommand","userCommand"],"sources":["../../src/cli/commands/authconnection/args.ts","../../src/cli/commands/authconnection/authorize.ts","../../src/cli/commands/authconnection/delete.ts","../../src/cli/commands/authconnection/list.ts","../../src/cli/commands/authconnection/revoke.ts","../../src/cli/commands/authconnection/index.ts","../../src/cli/commands/crashreport/list.ts","../../src/cli/commands/crashreport/send.ts","../../src/cli/commands/crashreport/index.ts","../../src/cli/commands/deploy/index.ts","../../src/cli/commands/executor/index.ts","../../src/cli/shared/function-script-download.ts","../../src/cli/shared/stack-trace.ts","../../src/cli/commands/function/logs.ts","../../src/cli/commands/function/bundle.ts","../../src/cli/commands/function/detect.ts","../../src/cli/commands/function/test-run.ts","../../src/cli/commands/function/index.ts","../../src/cli/commands/generate/index.ts","../../src/cli/commands/init.ts","../../src/cli/commands/login.ts","../../src/cli/commands/logout.ts","../../src/cli/commands/machineuser/index.ts","../../src/cli/commands/oauth2client/index.ts","../../src/cli/commands/open.ts","../../src/cli/commands/organization/folder/index.ts","../../src/cli/commands/organization/index.ts","../../src/cli/commands/profile/create.ts","../../src/cli/commands/profile/delete.ts","../../src/cli/commands/profile/list.ts","../../src/cli/commands/profile/update.ts","../../src/cli/commands/profile/index.ts","../../src/cli/commands/secret/args.ts","../../src/cli/commands/secret/check-vault-managed.ts","../../src/cli/commands/secret/create.ts","../../src/cli/commands/secret/delete.ts","../../src/cli/commands/secret/list.ts","../../src/cli/commands/secret/update.ts","../../src/cli/commands/secret/vault/args.ts","../../src/cli/commands/secret/vault/create.ts","../../src/cli/commands/secret/vault/delete.ts","../../src/cli/commands/secret/vault/list.ts","../../src/cli/commands/secret/vault/index.ts","../../src/cli/commands/secret/index.ts","../../src/cli/commands/setup/github/deploy.workflow.yml","../../src/cli/commands/setup/github/setup-bun.yml","../../src/cli/commands/setup/github/setup-npm.yml","../../src/cli/commands/setup/github/setup-pnpm.yml","../../src/cli/commands/setup/github/setup-yarn.yml","../../src/cli/commands/setup/github/template-deploy.ts","../../src/cli/commands/setup/github/github.ts","../../src/cli/commands/setup/github/index.ts","../../src/cli/commands/setup/index.ts","../../src/cli/shared/skills-installer.ts","../../src/cli/commands/skills/install.ts","../../src/cli/commands/skills/index.ts","../../src/cli/shared/progress.ts","../../src/cli/commands/staticwebsite/deploy.ts","../../src/cli/commands/staticwebsite/domain/status.ts","../../src/cli/commands/staticwebsite/domain/get.ts","../../src/cli/commands/staticwebsite/domain/list.ts","../../src/cli/commands/staticwebsite/domain/index.ts","../../src/cli/commands/staticwebsite/get.ts","../../src/cli/commands/staticwebsite/list.ts","../../src/cli/commands/staticwebsite/index.ts","../../src/cli/commands/tailordb/erd/local-schema.ts","../../src/cli/commands/tailordb/erd/schema.ts","../../src/cli/commands/tailordb/erd/utils.ts","../../src/cli/commands/tailordb/erd/viewer.ts","../../src/cli/commands/tailordb/erd/export.ts","../../src/cli/commands/tailordb/erd/deploy.ts","../../src/cli/commands/tailordb/erd/serve.ts","../../src/cli/commands/tailordb/erd/index.ts","../../src/cli/commands/tailordb/migrate/script.ts","../../src/cli/commands/tailordb/migrate/set.ts","../../src/cli/commands/tailordb/migrate/status.ts","../../src/cli/commands/tailordb/migrate/index.ts","../../src/cli/commands/tailordb/index.ts","../../src/cli/commands/upgrade/index.ts","../../src/cli/commands/user/current.ts","../../src/cli/commands/user/list.ts","../../src/cli/commands/user/pat/transform.ts","../../src/cli/commands/user/pat/create.ts","../../src/cli/commands/user/pat/delete.ts","../../src/cli/commands/user/pat/list.ts","../../src/cli/commands/user/pat/update.ts","../../src/cli/commands/user/pat/index.ts","../../src/cli/commands/user/switch.ts","../../src/cli/commands/user/index.ts","../../src/cli/commands/workflow/index.ts","../../src/cli/commands/workspace/app/index.ts","../../src/cli/commands/workspace/user/index.ts","../../src/cli/commands/workspace/index.ts","../../src/cli/index.ts"],"sourcesContent":["import { arg } from \"politty\";\nimport { z } from \"zod\";\n\n/**\n * Arguments for identifying an auth connection\n */\nexport const connectionNameArgs = {\n name: arg(z.string(), {\n alias: \"n\",\n description: \"Auth connection name\",\n }),\n};\n","import * as crypto from \"node:crypto\";\nimport * as http from \"node:http\";\nimport open from \"open\";\nimport { z } from \"zod\";\nimport { workspaceArgs } from \"@/cli/shared/args\";\nimport { fetchAll, initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport { connectionNameArgs } from \"./args\";\n\nconst defaultPort = 8080;\nconst defaultScopes = \"openid,profile,email\";\n\n/**\n * Fetch the OpenID Connect discovery document from a provider URL.\n * @param providerUrl - OAuth2 provider base URL\n * @returns Discovery document with authorization_endpoint\n */\nasync function fetchOIDCDiscovery(\n providerUrl: string,\n): Promise<{ authorization_endpoint: string }> {\n const url = providerUrl.replace(/\\/$/, \"\") + \"/.well-known/openid-configuration\";\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch OIDC discovery from ${url}: ${response.status}`);\n }\n return response.json() as Promise<{\n authorization_endpoint: string;\n }>;\n}\n\nfunction randomState() {\n return crypto.randomBytes(32).toString(\"base64url\");\n}\n\nexport const authorizeAuthConnectionCommand = defineAppCommand({\n name: \"authorize\",\n description: \"Authorize an auth connection via OAuth2 flow.\",\n args: z\n .object({\n ...workspaceArgs,\n ...connectionNameArgs,\n scopes: z\n .string()\n .optional()\n .default(defaultScopes)\n .describe(\"OAuth2 scopes to request (comma-separated)\"),\n port: z.coerce\n .number()\n .optional()\n .default(defaultPort)\n .describe(\"Local callback server port\"),\n \"no-browser\": z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Don't open browser automatically\"),\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n // Find the connection to get its provider URL and client ID\n const connections = await fetchAll(async (pageToken, maxPageSize) => {\n const { connections, nextPageToken } = await client.listAuthConnections({\n workspaceId,\n pageToken,\n pageSize: maxPageSize,\n });\n return [connections, nextPageToken];\n });\n\n const connection = connections.find((c) => c.name === args.name);\n if (!connection) {\n throw new Error(`Auth connection \"${args.name}\" not found.`);\n }\n\n if (connection.config.case !== \"oauth2\") {\n throw new Error(`Auth connection \"${args.name}\" is not an OAuth2 connection.`);\n }\n\n const oauth2Config = connection.config.value;\n const redirectUri = `http://localhost:${args.port}/callback`;\n const state = randomState();\n\n // Resolve authorization endpoint from discovery or explicit config\n let authorizationEndpoint: string;\n if (oauth2Config.authUrl) {\n authorizationEndpoint = oauth2Config.authUrl;\n } else {\n const discovery = await fetchOIDCDiscovery(oauth2Config.providerUrl);\n authorizationEndpoint = discovery.authorization_endpoint;\n }\n\n // Build authorization URL\n const authUrl = new URL(authorizationEndpoint);\n authUrl.searchParams.set(\"client_id\", oauth2Config.clientId);\n authUrl.searchParams.set(\"redirect_uri\", redirectUri);\n authUrl.searchParams.set(\"response_type\", \"code\");\n authUrl.searchParams.set(\"scope\", args.scopes.replace(/,/g, \" \"));\n authUrl.searchParams.set(\"state\", state);\n authUrl.searchParams.set(\"access_type\", \"offline\");\n\n await new Promise<void>((resolve, reject) => {\n const server = http.createServer(async (req, res) => {\n if (!req.url?.startsWith(\"/callback\")) {\n res.writeHead(404);\n res.end(\"Not found\");\n return;\n }\n\n try {\n const url = new URL(req.url, `http://localhost:${args.port}`);\n const code = url.searchParams.get(\"code\");\n const returnedState = url.searchParams.get(\"state\");\n const error = url.searchParams.get(\"error\");\n\n if (error) {\n throw new Error(`Authorization failed: ${error}`);\n }\n\n if (returnedState !== state) {\n throw new Error(\"State mismatch — possible CSRF attack.\");\n }\n\n if (!code) {\n throw new Error(\"No authorization code received.\");\n }\n\n // Send authorization code to the platform for server-side token exchange\n await client.exchangeAuthConnectionAuthorizationCode({\n workspaceId,\n connectionName: args.name,\n authorizationCode: code,\n redirectUri,\n });\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><h1>Authorization successful</h1><p>You can close this window.</p></body></html>\",\n );\n server.close();\n resolve();\n } catch (err) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(`Authorization failed: ${err instanceof Error ? err.message : \"Unknown error\"}`);\n server.close();\n reject(err);\n }\n });\n\n const timeout = setTimeout(\n () => {\n server.close();\n reject(new Error(\"Authorization timeout exceeded (5 minutes).\"));\n },\n 5 * 60 * 1000,\n );\n\n server.on(\"close\", () => {\n clearTimeout(timeout);\n });\n\n server.on(\"error\", (err) => {\n reject(err);\n });\n\n server.listen(args.port, async () => {\n const authorizeUrl = authUrl.toString();\n logger.info(`Opening browser for authorization:\\n\\n${authorizeUrl}\\n`);\n if (!args[\"no-browser\"]) {\n try {\n await open(authorizeUrl);\n } catch {\n logger.warn(\n \"Failed to open browser automatically. Please open the URL above manually.\",\n );\n }\n }\n });\n });\n\n logger.success(`Auth connection \"${args.name}\" authorized successfully.`);\n },\n});\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { z } from \"zod\";\nimport { confirmationArgs, workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { prompt } from \"@/cli/shared/prompt\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport { connectionNameArgs } from \"./args\";\n\nexport const deleteAuthConnectionCommand = defineAppCommand({\n name: \"delete\",\n description: \"Delete an auth connection entirely.\",\n args: z\n .object({\n ...workspaceArgs,\n ...connectionNameArgs,\n ...confirmationArgs,\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n if (!args.yes) {\n const confirmation = await prompt.text({\n message: `Enter the connection name to confirm deletion (\"${args.name}\"):`,\n });\n\n if (confirmation !== args.name) {\n logger.info(\"Auth connection deletion cancelled.\");\n return;\n }\n }\n\n try {\n await client.deleteAuthConnection({ workspaceId, connectionName: args.name });\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(`Auth connection \"${args.name}\" not found.`, { cause: error });\n }\n throw error;\n }\n\n logger.success(`Auth connection \"${args.name}\" deleted.`);\n },\n});\n","import { timestampDate } from \"@bufbuild/protobuf/wkt\";\nimport { Code, ConnectError } from \"@connectrpc/connect\";\nimport { z } from \"zod\";\nimport { paginationArgs, toPageDirection, workspaceArgs } from \"@/cli/shared/args\";\nimport { fetchPaged, initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport type { AuthConnection } from \"@tailor-proto/tailor/v1/auth_resource_pb\";\n\ninterface ConnectionInfo {\n name: string;\n type: string;\n providerUrl: string;\n issuerUrl: string;\n clientId: string;\n authUrl: string;\n tokenUrl: string;\n createdAt: Date | null;\n}\n\nfunction connectionInfo(connection: AuthConnection): ConnectionInfo {\n const oauth2 = connection.config.case === \"oauth2\" ? connection.config.value : undefined;\n return {\n name: connection.name,\n type: connection.config.case ?? \"unknown\",\n providerUrl: oauth2?.providerUrl ?? \"\",\n issuerUrl: oauth2?.issuerUrl ?? \"\",\n clientId: oauth2?.clientId ?? \"\",\n authUrl: oauth2?.authUrl ?? \"\",\n tokenUrl: oauth2?.tokenUrl ?? \"\",\n createdAt: connection.createdAt ? timestampDate(connection.createdAt) : null,\n };\n}\n\nexport const listAuthConnectionCommand = defineAppCommand({\n name: \"list\",\n description: \"List all auth connections.\",\n args: z.object({ ...workspaceArgs, ...paginationArgs() }).strict(),\n run: async (args) => {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n try {\n const pageDirection = toPageDirection(args.order);\n const connections = await fetchPaged(\n async (pageToken, pageSize) => {\n const { connections, nextPageToken } = await client.listAuthConnections({\n workspaceId,\n pageToken,\n pageSize,\n pageDirection,\n });\n return [connections, nextPageToken];\n },\n { limit: args.limit },\n );\n logger.out(connections.map(connectionInfo));\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n logger.out([]);\n return;\n }\n throw error;\n }\n },\n});\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { z } from \"zod\";\nimport { confirmationArgs, workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { prompt } from \"@/cli/shared/prompt\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport { connectionNameArgs } from \"./args\";\n\nexport const revokeAuthConnectionCommand = defineAppCommand({\n name: \"revoke\",\n description:\n \"Revoke an auth connection's tokens (keeps the connection; use 'delete' to remove it).\",\n notes:\n \"Revoke invalidates the connection's active session and tokens but keeps the connection and its stored credentials, so it can be re-authorized later. Use `delete` to remove the connection entirely.\",\n args: z\n .object({\n ...workspaceArgs,\n ...connectionNameArgs,\n ...confirmationArgs,\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n if (!args.yes) {\n const confirmation = await prompt.text({\n message: `Enter the connection name to confirm revocation (\"${args.name}\"):`,\n });\n\n if (confirmation !== args.name) {\n logger.info(\"Auth connection revocation cancelled.\");\n return;\n }\n }\n\n try {\n await client.revokeAuthConnection({\n workspaceId,\n connectionName: args.name,\n });\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(`Auth connection \"${args.name}\" not found.`, { cause: error });\n }\n throw error;\n }\n\n logger.success(`Auth connection \"${args.name}\" revoked.`);\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { authorizeAuthConnectionCommand } from \"./authorize\";\nimport { deleteAuthConnectionCommand } from \"./delete\";\nimport { listAuthConnectionCommand } from \"./list\";\nimport { revokeAuthConnectionCommand } from \"./revoke\";\n\nexport const authconnectionCommand = defineCommand({\n name: \"authconnection\",\n description: \"Manage auth connections.\",\n subCommands: {\n authorize: authorizeAuthConnectionCommand,\n list: listAuthConnectionCommand,\n revoke: revokeAuthConnectionCommand,\n delete: deleteAuthConnectionCommand,\n },\n async run() {\n await runCommand(listAuthConnectionCommand, []);\n },\n});\n","import * as fs from \"node:fs\";\nimport * as path from \"pathe\";\nimport { z } from \"zod\";\nimport { parseCrashReportConfig } from \"@/cli/crashreport/config\";\nimport { CRASH_LOG_EXTENSION } from \"@/cli/crashreport/writer\";\nimport { type Order, paginationArgs } from \"@/cli/shared/args\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { logger } from \"@/cli/shared/logger\";\n\nexport function orderAndLimitCrashReports(\n entries: string[],\n options: { order?: Order; limit?: number },\n): string[] {\n const sorted = entries.filter((f) => f.endsWith(CRASH_LOG_EXTENSION)).toSorted();\n const ordered = options.order === \"asc\" ? sorted : sorted.toReversed();\n return options.limit && options.limit > 0 ? ordered.slice(0, options.limit) : ordered;\n}\n\nfunction formatCrashReportFiles(files: string[], localDir: string) {\n return files.map((file) => ({\n file,\n path: path.join(localDir, file),\n }));\n}\n\nexport const listCommand = defineAppCommand({\n name: \"list\",\n description: \"List local crash report files.\",\n args: z\n .object({\n ...paginationArgs(),\n })\n .strict(),\n run: async (args) => {\n const config = parseCrashReportConfig();\n const jsonOutput = logger.jsonMode;\n if (!config.localDir) {\n logger.info(\"Crash report directory not available.\");\n if (jsonOutput) {\n logger.out([]);\n }\n return;\n }\n\n let entries: string[];\n try {\n entries = fs.readdirSync(config.localDir);\n } catch {\n logger.info(\"No crash reports found.\");\n if (jsonOutput) {\n logger.out([]);\n }\n return;\n }\n\n const files = orderAndLimitCrashReports(entries, { order: args.order, limit: args.limit });\n\n if (files.length === 0) {\n logger.info(\"No crash reports found.\");\n if (jsonOutput) {\n logger.out([]);\n }\n return;\n }\n\n if (jsonOutput) {\n logger.out(formatCrashReportFiles(files, config.localDir));\n return;\n }\n\n logger.info(`${files.length} crash report(s) in ${config.localDir}:`);\n for (const file of files) {\n logger.log(` ${file}`);\n }\n },\n});\n","import * as fs from \"node:fs\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { sendCrashReport } from \"@/cli/crashreport/sender\";\nimport { JSON_FOOTER_MARKER } from \"@/cli/crashreport/writer\";\nimport { userAgent } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { logger } from \"@/cli/shared/logger\";\nimport type { CrashReport } from \"@/cli/crashreport/report\";\n\nexport const sendCommand = defineAppCommand({\n name: \"send\",\n description: \"Submit a crash report to help improve the SDK.\",\n args: z\n .object({\n file: arg(z.string(), {\n description: \"Path to the crash report file\",\n required: true,\n completion: { type: \"file\", extensions: [\"log\"] },\n }),\n })\n .strict(),\n run: async (args) => {\n let content: string;\n try {\n content = fs.readFileSync(args.file, \"utf-8\");\n } catch {\n logger.error(`Crash report file not found: ${args.file}`);\n process.exit(1);\n }\n\n const report = parseCrashLogFile(content);\n if (!report) {\n logger.error(\"Failed to parse crash report file. The file may be corrupted.\");\n process.exit(1);\n }\n\n const ua = await userAgent();\n logger.info(\"Sending crash report...\");\n const success = await sendCrashReport(report, ua);\n\n if (success) {\n logger.success(\"Crash report submitted successfully. Thank you!\");\n } else {\n logger.error(\"Failed to submit crash report. The server may be unavailable.\");\n process.exit(1);\n }\n },\n});\n\n/**\n * Parse a crash log file back into a CrashReport object.\n * Reads the embedded JSON footer appended by formatCrashReport.\n * @param content - File content\n * @returns Parsed report or undefined if parsing fails\n */\nexport function parseCrashLogFile(content: string): CrashReport | undefined {\n try {\n const normalized = content.replace(/\\r\\n/g, \"\\n\");\n const marker = `\\n${JSON_FOOTER_MARKER}\\n`;\n const lastIdx = normalized.lastIndexOf(marker);\n if (lastIdx === -1) return undefined;\n const jsonLine = normalized.slice(lastIdx + marker.length).split(\"\\n\")[0];\n if (!jsonLine) return undefined;\n return JSON.parse(jsonLine) as CrashReport;\n } catch {\n return undefined;\n }\n}\n","import { defineCommand, runCommand } from \"politty\";\nimport { listCommand } from \"./list\";\nimport { sendCommand } from \"./send\";\n\nexport const crashReportCommand = defineCommand({\n name: \"crashreport\",\n aliases: [\"crash-report\"],\n description: \"Manage crash reports.\",\n subCommands: {\n list: listCommand,\n send: sendCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { deploy } from \"@/cli/commands/deploy/deploy\";\nimport { confirmationArgs, deploymentArgs } from \"@/cli/shared/args\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\n\nexport const deployCommand = defineAppCommand({\n name: \"deploy\",\n aliases: [\"apply\"],\n description: \"Deploy your application by applying the Tailor configuration.\",\n args: z\n .object({\n ...deploymentArgs,\n ...confirmationArgs,\n \"dry-run\": arg(z.boolean().optional(), {\n alias: \"d\",\n description: \"Run the command without making any changes\",\n }),\n \"no-schema-check\": arg(z.boolean().optional(), {\n description: \"Skip schema diff check against migration snapshots\",\n }),\n \"no-cache\": arg(z.boolean().optional(), {\n description: \"Disable bundle caching for this run\",\n }),\n \"clean-cache\": arg(z.boolean().optional(), {\n description: \"Clean the bundle cache before building\",\n }),\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n const { initTelemetry } = await import(\"@/cli/telemetry\");\n await initTelemetry();\n await deploy({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n configPath: args.config,\n dryRun: args[\"dry-run\"],\n yes: args.yes,\n noSchemaCheck: args[\"no-schema-check\"],\n noCache: args[\"no-cache\"],\n cleanCache: args[\"clean-cache\"],\n });\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { getCommand } from \"./get\";\nimport { jobsCommand } from \"./jobs\";\nimport { listCommand } from \"./list\";\nimport { triggerCommand } from \"./trigger\";\nimport { webhookCommand } from \"./webhook\";\n\nexport const executorCommand = defineCommand({\n name: \"executor\",\n description: \"Manage executors\",\n subCommands: {\n trigger: triggerCommand,\n jobs: jobsCommand,\n list: listCommand,\n get: getCommand,\n webhook: webhookCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","/**\n * Download a deployed function script from the function registry.\n *\n * Wraps the server-streaming `downloadFunctionRegistryScript` RPC and\n * concatenates content chunks into a single UTF-8 string.\n */\n\nimport { timestampDate } from \"@bufbuild/protobuf/wkt\";\nimport { FunctionExecution_Type } from \"@tailor-proto/tailor/v1/function_resource_pb\";\nimport { logger } from \"@/cli/shared/logger\";\nimport type { OperatorClient } from \"@/cli/shared/client\";\n\n/**\n * Translate a `FunctionExecution.scriptName` into the corresponding\n * function registry name used by `downloadFunctionRegistryScript`.\n *\n * The platform records executions under a script-name format that\n * differs from the registry name. The execution `type` is used as the\n * primary discriminator because workflow job names are unconstrained\n * strings (`WorkflowJobSchema.name: z.string()`) and may contain dots\n * that collide with the resolver / executor / hook filename suffixes.\n *\n * JOB: `<jobName>` -> `workflow--<jobName>`\n * STANDARD resolver: `<namespace>.<name>.body.js` -> `resolver--<namespace>--<name>`\n * STANDARD executor: `<name>.operation.js` -> `executor--<name>`\n * STANDARD auth hook: `<authName>.<hookPoint>.hook.js` -> `auth-hook--<authName>--<hookPoint>`\n *\n * For older servers that leave `type` as `UNSPECIFIED`, the same\n * filename-suffix heuristic is applied, with a bare-name fallback to\n * `workflow--<name>` for backward compatibility. Returns `null` for\n * unrecognized formats (ad-hoc test-run scripts, seed scripts, etc.\n * that are not stored in the registry).\n * @param scriptName - The `scriptName` field from a `FunctionExecution`\n * @param executionType - The `type` field from a `FunctionExecution`\n * @returns The function registry name, or null when no mapping applies\n */\nexport function scriptNameToRegistryName(\n scriptName: string,\n executionType: FunctionExecution_Type,\n): string | null {\n // JOB: scriptName IS the workflow job name. Job names are\n // unconstrained, so dots must be preserved.\n if (executionType === FunctionExecution_Type.JOB) {\n return `workflow--${scriptName}`;\n }\n\n // Resolver: `<namespace>.<name>.body.js`\n // Use a non-greedy match for namespace so a name containing dots is\n // grouped into `name`, mirroring how resolvers are registered.\n const resolverMatch = /^([^.]+)\\.(.+)\\.body\\.js$/.exec(scriptName);\n if (resolverMatch) {\n const [, namespace, name] = resolverMatch;\n return `resolver--${namespace}--${name}`;\n }\n\n // Executor: `<name>.operation.js`\n const executorMatch = /^(.+)\\.operation\\.js$/.exec(scriptName);\n if (executorMatch) {\n const [, name] = executorMatch;\n return `executor--${name}`;\n }\n\n // Auth hook: `<authName>.<hookPoint>.hook.js`\n const authHookMatch = /^([^.]+)\\.([^.]+)\\.hook\\.js$/.exec(scriptName);\n if (authHookMatch) {\n const [, authName, hookPoint] = authHookMatch;\n return `auth-hook--${authName}--${hookPoint}`;\n }\n\n // Legacy (UNSPECIFIED) servers may not populate `type`. Fall back to\n // the historical bare-name heuristic for simple workflow job names.\n // Dotted job names cannot be disambiguated here and are left\n // unmapped; callers should upgrade the server for full coverage.\n if (executionType === FunctionExecution_Type.UNSPECIFIED && !scriptName.includes(\".\")) {\n return `workflow--${scriptName}`;\n }\n\n // Unknown format (ad-hoc test-run scripts, seed scripts, etc.) are\n // not in the registry; signal with null so the caller can fall back.\n return null;\n}\n\n/** Options for downloading a function registry script */\nexport interface DownloadFunctionScriptOptions {\n /** Operator client instance */\n client: OperatorClient;\n /** Workspace ID */\n workspaceId: string;\n /** Function registry name (translated from FunctionExecution.scriptName via scriptNameToRegistryName) */\n name: string;\n /** Optional content hash for a specific version (defaults to current version) */\n contentHash?: string;\n}\n\n/** Result of a successful function script download */\nexport interface DownloadedFunctionScript {\n /** Bundled script content as a UTF-8 string */\n code: string;\n /**\n * Server-side last-update timestamp of the registry entry, or null\n * when the metadata message omitted it. Callers comparing against an\n * execution timestamp use this to detect redeploys that happened\n * after the execution ran.\n */\n registryUpdatedAt: Date | null;\n}\n\n/**\n * Download a deployed function script.\n *\n * Returns the bundled script content together with the registry\n * entry's `updatedAt` timestamp. Returns null when the download fails\n * (script removed, network error, etc.) or when no content chunks are\n * received; errors are swallowed so callers can fall back to a\n * non-sourcemap display.\n * @param options - Download options\n * @returns Script content plus metadata, or null on failure / empty response\n */\nexport async function downloadFunctionScript(\n options: DownloadFunctionScriptOptions,\n): Promise<DownloadedFunctionScript | null> {\n const { client, workspaceId, name, contentHash } = options;\n try {\n const chunks: Uint8Array[] = [];\n let registryUpdatedAt: Date | null = null;\n for await (const response of client.downloadFunctionRegistryScript({\n workspaceId,\n name,\n contentHash,\n })) {\n if (response.payload.case === \"metadata\") {\n const updatedAt = response.payload.value.function?.updatedAt;\n if (updatedAt) registryUpdatedAt = timestampDate(updatedAt);\n } else if (response.payload.case === \"chunk\") {\n chunks.push(response.payload.value);\n }\n }\n if (chunks.length === 0) return null;\n return {\n code: Buffer.concat(chunks).toString(\"utf-8\"),\n registryUpdatedAt,\n };\n } catch (error) {\n logger.debug(`Failed to download function script \"${options.name}\": ${error}`);\n return null;\n }\n}\n","/**\n * Stack trace parsing, sourcemap-based source identification, and\n * formatted error display for the test-run command.\n *\n * The platform runtime automatically applies inline sourcemaps to V8\n * stack traces, so frame positions are already original source positions.\n * This module identifies which source file each frame belongs to via\n * reverse lookup (generatedPositionFor), then produces human-readable\n * output with file paths and code snippets.\n */\n\nimport { TraceMap, generatedPositionFor, originalPositionFor } from \"@jridgewell/trace-mapping\";\nimport * as path from \"pathe\";\nimport { styles } from \"@/cli/shared/logger\";\n\n/** A single frame parsed from a V8 stack trace */\nexport interface StackFrame {\n /** Function name (e.g. \"M\", \"Object.body\", \"<anonymous>\") */\n functionName: string;\n /** File URL (e.g. \"file:///test-run--error-test.js\") */\n file: string;\n /** Line number (1-based) */\n line: number;\n /** Column number (1-based) */\n column: number;\n}\n\n/** Result of parsing a V8 stack trace string */\nexport interface ParsedStackTrace {\n /** Error message with rpc prefix stripped */\n errorMessage: string;\n /** Parsed stack frames (only file:/// frames) */\n frames: StackFrame[];\n}\n\n// Matches: \" at functionName (file:///path:line:col)\"\n// Or: \" at file:///path:line:col\"\nconst STACK_FRAME_REGEX = /^\\s+at\\s+(?:(.+?)\\s+\\()?(file:\\/\\/\\/.+?):(\\d+):(\\d+)\\)?$/;\n\n// The rpc error prefix added by the platform\nconst RPC_ERROR_PREFIX = \"rpc error: code = Aborted desc = \";\n\n/**\n * Parse a V8 stack trace string into structured frames.\n * Only frames with `file:///` URLs are included (eval frames are skipped).\n * @param error - Raw error string potentially containing a V8 stack trace\n * @returns Parsed error message and stack frames\n */\nexport function parseStackTrace(error: string): ParsedStackTrace {\n const lines = error.split(\"\\n\");\n\n const messageLines: string[] = [];\n const frameLines: string[] = [];\n\n for (const line of lines) {\n if (/^\\s+at\\s+/.test(line)) {\n frameLines.push(line);\n } else if (frameLines.length === 0) {\n messageLines.push(line);\n }\n }\n\n let errorMessage = messageLines.join(\"\\n\");\n\n if (errorMessage.startsWith(RPC_ERROR_PREFIX)) {\n errorMessage = errorMessage.slice(RPC_ERROR_PREFIX.length);\n }\n\n const frames: StackFrame[] = [];\n for (const line of frameLines) {\n const match = STACK_FRAME_REGEX.exec(line);\n if (match) {\n frames.push({\n functionName: match[1] || \"<anonymous>\",\n file: match[2],\n line: Number(match[3]),\n column: Number(match[4]),\n });\n }\n }\n\n return { errorMessage, frames };\n}\n\nconst INLINE_SOURCEMAP_REGEX =\n /\\/\\/[#@]\\s*sourceMappingURL=data:application\\/json[^,]*;base64,(.+)$/m;\n\n/** Original source position resolved from a sourcemap */\nexport interface MappedSourcePosition {\n source: string;\n line: number;\n column: number;\n name: string | null;\n}\n\n/** A stack frame mapped back to original source */\nexport interface MappedStackFrame {\n /** The original parsed frame */\n original: StackFrame;\n /** Mapped source position, or null if mapping failed */\n mapped: MappedSourcePosition | null;\n}\n\n/**\n * Extract an inline sourcemap from bundled code and return a TraceMap.\n * @param bundledCode - Bundled JavaScript code potentially containing an inline sourcemap\n * @returns TraceMap instance, or null if no valid inline sourcemap is found\n */\nexport function extractInlineSourcemap(bundledCode: string): TraceMap | null {\n const match = INLINE_SOURCEMAP_REGEX.exec(bundledCode);\n if (!match) return null;\n\n try {\n const decoded = Buffer.from(match[1], \"base64\").toString(\"utf-8\");\n const rawSourceMap = JSON.parse(decoded);\n return new TraceMap(rawSourceMap);\n } catch {\n return null;\n }\n}\n\n/**\n * Map parsed stack frames to their source files using a TraceMap.\n *\n * The platform runtime applies inline sourcemaps automatically, so V8\n * reports already-mapped original source positions in stack traces.\n * This function uses generatedPositionFor to reverse-lookup which source\n * file each frame's line:column belongs to.\n * @param frames - Parsed stack frames (positions are already original source positions)\n * @param traceMap - TraceMap from inline sourcemap, or null\n * @returns Frames with identified source files\n */\nexport function mapStackFrames(\n frames: StackFrame[],\n traceMap: TraceMap | null,\n): MappedStackFrame[] {\n return frames.map((frame) => {\n if (!traceMap) {\n return { original: frame, mapped: null };\n }\n\n try {\n // Iterate in reverse: user code and entry file are typically last\n // in the sources array, while SDK internals and node_modules come first.\n for (let i = traceMap.sources.length - 1; i >= 0; i--) {\n const source = traceMap.sources[i];\n if (source == null) continue;\n\n const genPos = generatedPositionFor(traceMap, {\n source,\n line: frame.line,\n column: frame.column - 1, // V8 is 1-based, trace-mapping is 0-based\n });\n\n if (genPos.line == null) continue;\n\n // Round-trip validation: generatedPositionFor uses\n // GREATEST_LOWER_BOUND bias by default, so it may return a\n // near-match when the queried source has a mapping on the target\n // line at an earlier column. Verify the generated position maps\n // back to the exact (source, line, column) we queried before\n // accepting the match; otherwise try the next source.\n const origPos = originalPositionFor(traceMap, {\n line: genPos.line,\n column: genPos.column,\n });\n if (\n origPos.source !== source ||\n origPos.line !== frame.line ||\n origPos.column !== frame.column - 1\n ) {\n continue;\n }\n\n return {\n original: frame,\n mapped: {\n source,\n line: frame.line,\n column: frame.column,\n name: null,\n },\n };\n }\n\n return { original: frame, mapped: null };\n } catch {\n return { original: frame, mapped: null };\n }\n });\n}\n\n/**\n * Detect the URI scheme for opening files based on VISUAL/EDITOR env vars.\n * @returns \"vscode\" if the editor looks like VS Code, otherwise null (use file://)\n */\nfunction detectEditorScheme(): string | null {\n const editor = process.env.VISUAL || process.env.EDITOR || \"\";\n if (/\\bcode\\b/.test(editor)) return \"vscode\";\n return null;\n}\n\n/**\n * Wrap text in an OSC 8 terminal hyperlink.\n * @param uri - URI to open when the link is clicked\n * @param text - Visible text displayed in the terminal\n * @returns Escaped string with OSC 8 sequences\n */\nfunction osc8Link(uri: string, text: string): string {\n return `\\x1b]8;;${uri}\\x07${text}\\x1b]8;;\\x07`;\n}\n\n/**\n * Build a clickable terminal link for a source location.\n * Uses vscode:// URI if the editor is VS Code, otherwise file:// URI.\n * @param displayPath - Path to display in the terminal\n * @param absolutePath - Absolute file path for the URI\n * @param line - 1-based line number\n * @param column - 1-based column number\n * @returns OSC 8 hyperlinked location string\n */\nfunction buildSourceLink(\n displayPath: string,\n absolutePath: string,\n line: number,\n column: number,\n): string {\n const location = `${displayPath}:${line}:${column}`;\n const scheme = detectEditorScheme();\n if (scheme === \"vscode\") {\n return osc8Link(`vscode://file${absolutePath}:${line}:${column}`, location);\n }\n return osc8Link(`file://${absolutePath}`, location);\n}\n\nconst SNIPPET_CONTEXT_LINES = 2;\n\n/**\n * Build a code snippet around a target line from source content.\n * Shows SNIPPET_CONTEXT_LINES above and below with line numbers.\n * The target line is marked with `>` and highlighted.\n * @param content - Full source file content\n * @param targetLine - 1-based line number to highlight\n * @returns Formatted snippet string\n */\nfunction buildCodeSnippet(content: string, targetLine: number): string {\n const lines = content.split(\"\\n\");\n const start = Math.max(0, targetLine - 1 - SNIPPET_CONTEXT_LINES);\n const end = Math.min(lines.length, targetLine + SNIPPET_CONTEXT_LINES);\n\n const gutterWidth = String(end).length;\n const snippetLines: string[] = [];\n\n for (let i = start; i < end; i++) {\n const lineNum = i + 1;\n const gutter = String(lineNum).padStart(gutterWidth);\n const lineContent = lines[i];\n\n if (lineNum === targetLine) {\n snippetLines.push(` ${styles.error(\">\")} ${styles.error(`${gutter} | ${lineContent}`)}`);\n } else {\n snippetLines.push(` ${styles.dim(`${gutter} | ${lineContent}`)}`);\n }\n }\n\n return snippetLines.join(\"\\n\");\n}\n\n/**\n * Format mapped stack frames into a human-readable error display.\n * Includes file paths (clickable in terminals), code snippets, and\n * falls back to raw frame info for unmapped frames.\n * @param errorMessage - Cleaned error message\n * @param frames - Mapped stack frames\n * @param traceMap - TraceMap for retrieving source content (may be null)\n * @param bundleDir - Absolute path to bundle output directory for resolving source paths\n * @returns Formatted error string for display\n */\nexport function formatMappedError(\n errorMessage: string,\n frames: MappedStackFrame[],\n traceMap: TraceMap | null,\n bundleDir?: string,\n): string {\n const parts: string[] = [` ${styles.error(errorMessage)}`];\n\n for (const frame of frames) {\n if (frame.mapped) {\n const { source, line, column, name } = frame.mapped;\n const absolutePath = bundleDir ? path.resolve(bundleDir, source) : path.resolve(source);\n const rel = path.relative(process.cwd(), absolutePath);\n // Only paths escaping cwd (starting with `..`) are shown as-is; all\n // other relative paths get an explicit `./` prefix so dotfiles like\n // `.tailor-sdk/...` are not mistaken for relative-path markers.\n const displaySource = rel.startsWith(\"..\") ? rel : `./${rel}`;\n const fnName = name ?? frame.original.functionName;\n const link = buildSourceLink(displaySource, absolutePath, line, column);\n parts.push(`\\n at ${fnName} (${link})`);\n\n if (traceMap) {\n const sourceIndex = traceMap.sources.indexOf(source);\n if (sourceIndex !== -1) {\n const content = traceMap.sourcesContent?.[sourceIndex];\n if (content) {\n parts.push(buildCodeSnippet(content, line));\n }\n }\n }\n } else {\n const file = frame.original.file.replace(/^file:\\/\\/\\//, \"\");\n const location = `${file}:${frame.original.line}:${frame.original.column}`;\n parts.push(`\\n ${styles.dim(`at ${frame.original.functionName} (${location})`)}`);\n }\n }\n\n return parts.join(\"\\n\");\n}\n\n/**\n * Format an error string with sourcemap-based source locations.\n * This is the main entry point for test-run error display.\n *\n * The platform runtime applies inline sourcemaps automatically, so V8\n * stack frames already contain original source positions. This function\n * identifies which source file each frame belongs to and formats the\n * error with file paths, line numbers, and code snippets.\n *\n * Returns null if sourcemap processing is not possible (no inline\n * sourcemap, no stack trace, or processing error).\n * @param error - Raw error string from script execution (may contain V8 stack trace)\n * @param bundledCode - Bundled JavaScript code (may contain inline sourcemap)\n * @param bundleDir - Absolute path to the bundle output directory (sourcemap paths are relative to this)\n * @returns Formatted error string, or null to fall back to default display\n */\nexport function formatErrorWithSourcemap(\n error: string,\n bundledCode: string,\n bundleDir: string,\n): string | null {\n try {\n const { errorMessage, frames } = parseStackTrace(error);\n if (frames.length === 0) return null;\n\n const traceMap = extractInlineSourcemap(bundledCode);\n if (!traceMap) return null;\n\n const mappedFrames = mapStackFrames(frames, traceMap);\n\n if (mappedFrames.some((f) => f.mapped !== null)) {\n return formatMappedError(errorMessage, mappedFrames, traceMap, bundleDir);\n }\n\n return null;\n } catch {\n return null;\n }\n}\n","import { timestampDate } from \"@bufbuild/protobuf/wkt\";\nimport { FunctionExecution_Type } from \"@tailor-proto/tailor/v1/function_resource_pb\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { pagedLogArgs, toPageDirection, workspaceArgs } from \"@/cli/shared/args\";\nimport { fetchPaged, initOperatorClient, type OperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { formatKeyValueTable } from \"@/cli/shared/format\";\nimport { functionExecutionStatusToString } from \"@/cli/shared/function-execution\";\nimport {\n downloadFunctionScript,\n scriptNameToRegistryName,\n} from \"@/cli/shared/function-script-download\";\nimport { logger, styles } from \"@/cli/shared/logger\";\nimport { formatErrorWithSourcemap } from \"@/cli/shared/stack-trace\";\nimport type { FunctionExecution } from \"@tailor-proto/tailor/v1/function_resource_pb\";\n\ninterface FunctionExecutionListInfo {\n id: string;\n scriptName: string;\n status: string;\n type: string;\n startedAt: Date | null;\n finishedAt: Date | null;\n}\n\ninterface FunctionExecutionErrorDisplay {\n name: string;\n message: string;\n stackTrace: string;\n}\n\ninterface FunctionExecutionDetailInfo extends FunctionExecutionListInfo {\n logs: string;\n result: string;\n error: FunctionExecutionErrorDisplay | null;\n}\n\n/**\n * Convert function execution type enum to string.\n * @param type - Function execution type enum value\n * @returns Type string representation\n */\nfunction functionExecutionTypeToString(type: FunctionExecution_Type): string {\n switch (type) {\n case FunctionExecution_Type.STANDARD:\n return \"STANDARD\";\n case FunctionExecution_Type.JOB:\n return \"JOB\";\n default:\n return \"UNSPECIFIED\";\n }\n}\n\n/**\n * Transform FunctionExecution to FunctionExecutionListInfo for list display.\n * @param execution - FunctionExecution from proto\n * @returns Function execution list info\n */\nfunction toFunctionExecutionListInfo(execution: FunctionExecution): FunctionExecutionListInfo {\n return {\n id: execution.id,\n scriptName: execution.scriptName,\n status: functionExecutionStatusToString(execution.status),\n type: functionExecutionTypeToString(execution.type),\n startedAt: execution.startedAt ? timestampDate(execution.startedAt) : null,\n finishedAt: execution.finishedAt ? timestampDate(execution.finishedAt) : null,\n };\n}\n\n/**\n * Transform FunctionExecution to FunctionExecutionDetailInfo for detail display.\n * @param execution - FunctionExecution from proto\n * @returns Function execution detail info\n */\nfunction toFunctionExecutionDetailInfo(execution: FunctionExecution): FunctionExecutionDetailInfo {\n return {\n ...toFunctionExecutionListInfo(execution),\n logs: execution.logs,\n result: execution.result,\n error: execution.error\n ? {\n name: execution.error.name,\n message: execution.error.message,\n stackTrace: execution.error.stackTrace,\n }\n : null,\n };\n}\n\n/**\n * Compose a V8-style error string from a FunctionErrorInfo so that it\n * can be parsed by `parseStackTrace`.\n *\n * `Error.prototype.stack` in V8 begins with `Name: message`, but the\n * platform may store only the frame lines; in that case prepend the\n * message line. When `stackTrace` is empty, return only `Name: message`.\n * @param error - Function error info from FunctionExecution\n * @returns Error string suitable for parseStackTrace\n */\nexport function composeExecutionErrorString(error: FunctionExecutionErrorDisplay): string {\n const { name, message, stackTrace } = error;\n if (!stackTrace) return `${name}: ${message}`;\n const firstLine = stackTrace.split(\"\\n\", 1)[0] ?? \"\";\n if (/^\\s+at\\s+/.test(firstLine)) {\n return `${name}: ${message}\\n${stackTrace}`;\n }\n return stackTrace;\n}\n\n/**\n * Plain-text fallback used when sourcemap mapping is unavailable.\n * Shows `Name: message` then the raw stack trace lines (dimmed).\n *\n * Uses `composeExecutionErrorString` to produce a canonical\n * `Name: message\\n<frames>` string first, so the header is never\n * duplicated when `stackTrace` already begins with `Name: message`.\n * @param error - Function error info from FunctionExecution\n * @returns Formatted fallback string for display\n */\nfunction formatExecutionErrorFallback(error: FunctionExecutionErrorDisplay): string {\n const composed = composeExecutionErrorString(error);\n const [headerLine, ...frameLines] = composed.split(\"\\n\");\n return [\n ` ${styles.error(headerLine ?? \"\")}`,\n ...frameLines.map((line) => ` ${styles.dim(line)}`),\n ].join(\"\\n\");\n}\n\n/**\n * Format an execution error for display, applying sourcemap mapping\n * when bundled code is available.\n * @param error - Function error info from FunctionExecution\n * @param bundledCode - Downloaded bundled script content (may be null)\n * @returns Formatted error string for display\n */\nexport function formatExecutionError(\n error: FunctionExecutionErrorDisplay,\n bundledCode: string | null,\n): string {\n if (bundledCode && error.stackTrace) {\n const errorString = composeExecutionErrorString(error);\n const formatted = formatErrorWithSourcemap(errorString, bundledCode, process.cwd());\n if (formatted) return formatted;\n }\n return formatExecutionErrorFallback(error);\n}\n\ninterface PrintFunctionExecutionDetailOptions {\n detail: FunctionExecutionDetailInfo;\n /** Bundled script content for sourcemap-based stack trace mapping (optional) */\n bundledCode?: string | null;\n}\n\n/**\n * Print function execution detail in a human-readable format.\n * @param options - Print options\n * @param options.detail - Function execution detail info\n * @param options.bundledCode - Downloaded bundled script content (used for sourcemap mapping)\n */\nfunction printFunctionExecutionDetail(options: PrintFunctionExecutionDetailOptions) {\n const { detail, bundledCode } = options;\n const formatDate = (date: Date | null): string => (date ? date.toISOString() : \"N/A\");\n\n const summaryData: [string, string][] = [\n [\"id\", detail.id],\n [\"scriptName\", detail.scriptName],\n [\"status\", detail.status],\n [\"type\", detail.type],\n [\"startedAt\", formatDate(detail.startedAt)],\n [\"finishedAt\", formatDate(detail.finishedAt)],\n ];\n logger.out(formatKeyValueTable(summaryData));\n\n if (detail.logs) {\n logger.log(styles.bold(\"\\nLogs:\"));\n for (const line of detail.logs.split(\"\\n\")) {\n logger.log(` ${line}`);\n }\n }\n\n if (detail.result) {\n logger.log(styles.bold(\"\\nResult:\"));\n try {\n const parsed = JSON.parse(detail.result);\n logger.log(` ${JSON.stringify(parsed, null, 2).split(\"\\n\").join(\"\\n \")}`);\n } catch {\n logger.log(` ${detail.result}`);\n }\n }\n\n if (detail.error) {\n logger.log(styles.bold(\"\\nError:\"));\n logger.log(formatExecutionError(detail.error, bundledCode ?? null));\n }\n}\n\ninterface DownloadScriptForMappingOptions {\n client: OperatorClient;\n workspaceId: string;\n /** FunctionExecution.scriptName (not the function registry name) */\n scriptName: string;\n /**\n * FunctionExecution.type. Used as the discriminator for the registry\n * name translation so that workflow job names containing dots are\n * not misread as resolver / seed scripts.\n */\n executionType: FunctionExecution_Type;\n /**\n * FunctionExecution.contentHash. When non-empty, the registry\n * download is pinned to this exact bundle so the stack trace maps\n * against the code that actually ran, regardless of subsequent\n * redeploys. Empty on older servers that did not populate the\n * field; in that case the caller falls back to a timestamp-based\n * staleness check using `executionStartedAt`.\n */\n executionContentHash: string;\n /**\n * When the execution started. Used as a fallback staleness signal\n * only when `executionContentHash` is empty: if the current registry\n * entry's `updatedAt` is strictly newer, the downloaded bundle may\n * differ from what was actually executed, so mapping is skipped to\n * avoid misleading source locations.\n */\n executionStartedAt: Date | null;\n}\n\n/**\n * Download a deployed function script for sourcemap mapping. Logs a\n * debug message on failure but never throws. Error display falls back\n * to a plain-text format when the script cannot be retrieved or when\n * the current registry entry is stale relative to the execution.\n *\n * When `executionContentHash` is non-empty, the download is pinned to\n * that exact bundle so mapping stays correct across redeploys. When\n * empty (older servers), falls back to comparing `registryUpdatedAt`\n * against `executionStartedAt`.\n *\n * `FunctionExecution.scriptName` does not match the function registry\n * name directly; `scriptNameToRegistryName` translates between the two\n * formats.\n * @param options - Lookup options\n * @param options.client - Operator client instance\n * @param options.workspaceId - Workspace ID\n * @param options.scriptName - Script name (matches FunctionExecution.scriptName)\n * @param options.executionType - Execution type used to discriminate registry name translation\n * @param options.executionContentHash - Content hash of the bundle that ran; pins the download when non-empty\n * @param options.executionStartedAt - Execution start timestamp used as fallback staleness signal\n * @returns Bundled script content, or null when unavailable / stale\n */\nexport async function downloadScriptForMapping(\n options: DownloadScriptForMappingOptions,\n): Promise<string | null> {\n const {\n client,\n workspaceId,\n scriptName,\n executionType,\n executionContentHash,\n executionStartedAt,\n } = options;\n const registryName = scriptNameToRegistryName(scriptName, executionType);\n if (registryName == null) {\n logger.debug(\n `Script \"${scriptName}\" is not a deployed registry script (e.g. test-run or seed); skipping sourcemap mapping.`,\n );\n return null;\n }\n\n if (executionContentHash !== \"\") {\n const pinned = await downloadFunctionScript({\n client,\n workspaceId,\n name: registryName,\n contentHash: executionContentHash,\n });\n if (pinned == null) {\n logger.debug(\n `Could not download pinned script \"${scriptName}\" (registry: \"${registryName}\", contentHash: \"${executionContentHash}\") for stack trace mapping; showing raw stack trace.`,\n );\n return null;\n }\n return pinned.code;\n }\n\n // Fallback for older servers that did not populate\n // FunctionExecution.contentHash: download the current bundle and\n // skip mapping if the registry was updated after the execution\n // started.\n const result = await downloadFunctionScript({ client, workspaceId, name: registryName });\n if (result == null) {\n logger.debug(\n `Could not download script \"${scriptName}\" (registry: \"${registryName}\") for stack trace mapping; showing raw stack trace.`,\n );\n return null;\n }\n if (\n executionStartedAt != null &&\n result.registryUpdatedAt != null &&\n result.registryUpdatedAt.getTime() > executionStartedAt.getTime()\n ) {\n logger.debug(\n `Registry script \"${registryName}\" was updated at ${result.registryUpdatedAt.toISOString()} after execution started at ${executionStartedAt.toISOString()}; skipping sourcemap mapping to avoid stale source locations.`,\n );\n return null;\n }\n return result.code;\n}\n\nexport const logsCommand = defineAppCommand({\n name: \"logs\",\n description: \"List or get function execution logs.\",\n notes: `When viewing a specific execution that failed, the command displays error details with the stack trace mapped back to your original source files (clickable file links and code snippets, matching \\`function test-run\\` output).\n\nStack traces stay accurate even after later redeploys, because the trace is resolved against the exact build that produced the execution. If that build is no longer available, the command falls back to a plain-text error display.`,\n examples: [\n {\n cmd: \"\",\n desc: \"List all function execution logs\",\n },\n {\n cmd: \"<execution-id>\",\n desc: \"Get execution details with logs\",\n },\n {\n cmd: \"--json\",\n desc: \"Output as JSON\",\n },\n {\n cmd: \"<execution-id> --json\",\n desc: \"Get execution details as JSON\",\n },\n ],\n args: z\n .object({\n ...workspaceArgs,\n ...pagedLogArgs,\n \"execution-id\": arg(z.string().optional(), {\n positional: true,\n description: \"Execution ID (if provided, shows details with logs)\",\n }),\n })\n .strict(),\n run: async (args) => {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n if (args.executionId) {\n const { execution } = await client.getFunctionExecution({\n workspaceId,\n executionId: args.executionId,\n });\n\n if (!execution) {\n throw new Error(`Function execution '${args.executionId}' not found.`);\n }\n\n const detail = toFunctionExecutionDetailInfo(execution);\n\n if (args.json) {\n logger.out(detail);\n } else {\n // Download the deployed script when an error is present so the\n // stack trace can be mapped back to original sources via the\n // inline sourcemap. Failure (script removed, no permission, etc.)\n // is non-fatal; we fall back to a plain-text error display.\n const bundledCode = detail.error\n ? await downloadScriptForMapping({\n client,\n workspaceId,\n scriptName: detail.scriptName,\n executionType: execution.type,\n executionContentHash: execution.contentHash,\n executionStartedAt: detail.startedAt,\n })\n : null;\n printFunctionExecutionDetail({ detail, bundledCode });\n }\n } else {\n const pageDirection = toPageDirection(args.order);\n const executions = await fetchPaged(\n async (pageToken, pageSize) => {\n const { executions, nextPageToken } = await client.listFunctionExecutions({\n workspaceId,\n pageToken,\n pageSize,\n pageDirection,\n });\n return [executions, nextPageToken];\n },\n { limit: args.limit },\n );\n\n const logs = executions.map(toFunctionExecutionListInfo);\n\n if (logs.length === 0 && !args.json) {\n logger.info(\"No function execution logs found.\");\n return;\n }\n logger.out(logs);\n }\n },\n});\n","/**\n * Bundler for function test-run command\n *\n * Bundles a single function file for execution via the TestExecScript API.\n * Generates an entry file based on the detected function type and bundles\n * with rolldown, following the same patterns as the existing bundlers.\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"pathe\";\nimport { resolveTSConfig } from \"pkg-types\";\nimport * as rolldown from \"rolldown\";\nimport {\n createLogLevelTreeshakeOptions,\n resolveBundleLogLevel,\n} from \"@/cli/shared/bundle-log-level\";\nimport { getDistDir } from \"@/cli/shared/dist-dir\";\nimport { composeFunctionTreeshakeOptions } from \"@/cli/shared/function-treeshake\";\nimport { resolveInlineSourcemap } from \"@/cli/shared/inline-sourcemap\";\nimport { platformBundleDefinePlugin } from \"@/cli/shared/platform-bundle-plugin\";\nimport { INVOKER_EXPR } from \"@/cli/shared/runtime-exprs\";\nimport ml from \"@/utils/multiline\";\nimport type { DetectedFunction } from \"./detect\";\nimport type { LogLevelInput } from \"@/types/app-config\";\n\n/** Machine user info resolved from config and API for bundle-time user context. */\nexport interface ResolvedMachineUser {\n /** Machine user name */\n name: string;\n /** Machine user ID (UUID from API, or nil UUID if unavailable) */\n id: string;\n /** Attributes from config (null if not found in config, e.g. external auth) */\n attributes: Record<string, unknown> | null;\n /** Attribute list from config */\n attributeList: unknown[];\n}\n\ninterface BundleForTestRunOptions {\n /** Detected function info */\n detected: DetectedFunction;\n /** Absolute path to the source file */\n sourceFile: string;\n /** Environment variables (injected into workflow job bundles) */\n env?: Record<string, string | number | boolean>;\n /** Inline sourcemap config value from defineConfig */\n inlineSourcemap?: boolean;\n /** Log level config value from defineConfig */\n logLevel?: LogLevelInput;\n /** Machine user info for injecting user context into the bundle */\n machineUser: ResolvedMachineUser;\n /** Workspace ID for user context */\n workspaceId: string;\n}\n\ninterface BundleForTestRunResult {\n /** The bundled JavaScript code */\n bundledCode: string;\n /** Name used for the script */\n scriptName: string;\n}\n\n/**\n * Bundle a function file for test-run execution via TestExecScript API.\n * @param options - Bundle options\n * @returns Bundled code and script name\n */\nexport async function bundleForTestRun(\n options: BundleForTestRunOptions,\n): Promise<BundleForTestRunResult> {\n const { detected, sourceFile, env = {}, machineUser, workspaceId } = options;\n const inlineSourcemap = resolveInlineSourcemap(options.inlineSourcemap);\n const bundleLogLevel = resolveBundleLogLevel(options.logLevel);\n\n const outputDir = path.resolve(getDistDir(), \"test-run\");\n fs.mkdirSync(outputDir, { recursive: true });\n\n const baseName = `test-run--${detected.name}`;\n const scriptName = `${baseName}.js`;\n const entryPath = path.join(outputDir, `${baseName}.entry.js`);\n\n const entryContent = generateEntry(detected, sourceFile, env, machineUser, workspaceId);\n fs.writeFileSync(entryPath, entryContent);\n\n let tsconfig: string | undefined;\n try {\n tsconfig = await resolveTSConfig();\n } catch {\n tsconfig = undefined;\n }\n\n const buildResult = await rolldown.build({\n plugins: [platformBundleDefinePlugin],\n input: entryPath,\n write: false,\n output: {\n format: \"esm\",\n sourcemap: inlineSourcemap ? \"inline\" : true,\n minify: inlineSourcemap\n ? {\n mangle: {\n keepNames: true,\n },\n }\n : true,\n codeSplitting: false,\n // Emit sourcemap `sources` relative to cwd so stack traces resolve\n // back to paths a user can open (e.g. `resolvers/add.ts`), not the\n // rolldown-default virtual output dir which produces spurious `..`\n // segments.\n dir: process.cwd(),\n },\n tsconfig,\n treeshake: composeFunctionTreeshakeOptions([createLogLevelTreeshakeOptions(bundleLogLevel)]),\n logLevel: \"silent\",\n } as rolldown.BuildOptions);\n\n const bundledCode = buildResult.output[0].code;\n\n return { bundledCode, scriptName };\n}\n\n/**\n * Generate entry file content based on the detected function type.\n * @param detected - Detected function info\n * @param sourceFile - Absolute path to the source file\n * @param env - Environment variables for workflow job bundles\n * @param machineUser - Resolved machine user info\n * @param workspaceId - Workspace ID\n * @returns Entry file content string\n */\nfunction generateEntry(\n detected: DetectedFunction,\n sourceFile: string,\n env: Record<string, string | number | boolean>,\n machineUser: ResolvedMachineUser,\n workspaceId: string,\n): string {\n const absoluteSourcePath = path.resolve(sourceFile);\n\n switch (detected.type) {\n case \"plain\":\n if (detected.namedMain) {\n return ml /* js */ `\n export { main } from \"${absoluteSourcePath}\";\n `;\n }\n return ml /* js */ `\n import _fn from \"${absoluteSourcePath}\";\n export { _fn as main };\n `;\n\n case \"resolver\": {\n // Mirrors the production resolver bundler (services/resolver/bundler.ts).\n // In production, the operationHook injects user/env into context.\n // For test-run, we embed machine user info since there's no operationHook.\n const userExpr = buildMachineUserExpr(machineUser, workspaceId);\n return ml /* js */ `\n import _internalResolver from \"${absoluteSourcePath}\";\n import { t } from \"@tailor-platform/sdk\";\n\n const _env = ${JSON.stringify(env)};\n const _user = ${userExpr};\n\n const $tailor_resolver_body = async (context) => {\n const _invoker = ${INVOKER_EXPR};\n if (_internalResolver.input) {\n const result = t.object(_internalResolver.input).parse({\n value: context,\n data: context,\n user: _user,\n });\n\n if (result.issues) {\n throw new TailorErrors(result.issues.map(issue => ({\n message: issue.message,\n path: issue.path ?? [],\n })));\n }\n }\n\n const enrichedContext = { input: context, env: _env, user: _user, invoker: _invoker };\n return _internalResolver.body(enrichedContext);\n };\n\n export { $tailor_resolver_body as main };\n `;\n }\n\n case \"executor\": {\n // Mirrors the production executor bundler (services/executor/bundler.ts).\n // In production, buildExecutorArgsExpr injects actor/env into args.\n // For test-run, we embed machine user as actor.\n const actorExpr = buildMachineActorExpr(machineUser, workspaceId);\n return ml /* js */ `\n import _internalExecutor from \"${absoluteSourcePath}\";\n\n const _env = ${JSON.stringify(env)};\n const _actor = ${actorExpr};\n\n const __executor_function = async (args) => {\n const _invoker = ${INVOKER_EXPR};\n return _internalExecutor.operation.body({ ...args, env: _env, actor: _actor, invoker: _invoker });\n };\n\n export { __executor_function as main };\n `;\n }\n\n case \"workflow-job\": {\n // Mirrors the production workflow bundler (services/workflow/bundler.ts).\n // Note: user context is not available in TestExecScript for workflow jobs.\n // The production workflow bundler's user mapping is being fixed in fix/workflow-user.\n const exportName = detected.exportName!;\n return ml /* js */ `\n import { ${exportName} } from \"${absoluteSourcePath}\";\n\n const env = ${JSON.stringify(env)};\n\n export async function main(input) {\n const invoker = ${INVOKER_EXPR};\n return await ${exportName}.body(input, { env, invoker });\n }\n `;\n }\n }\n}\n\n/**\n * Build a JSON expression for a machine user TailorUser object.\n * @param machineUser - Resolved machine user info\n * @param workspaceId - Workspace ID\n * @returns JSON string for the user expression\n */\nfunction buildMachineUserExpr(machineUser: ResolvedMachineUser, workspaceId: string): string {\n return JSON.stringify({\n id: machineUser.id,\n type: \"machine_user\",\n workspaceId,\n attributes: machineUser.attributes,\n attributeList: machineUser.attributeList,\n });\n}\n\n/**\n * Build a JSON expression for a machine user TailorActor object.\n * @param machineUser - Resolved machine user info\n * @param workspaceId - Workspace ID\n * @returns JSON string for the actor expression\n */\nfunction buildMachineActorExpr(machineUser: ResolvedMachineUser, workspaceId: string): string {\n return JSON.stringify({\n workspaceId,\n userId: machineUser.id,\n attributes: machineUser.attributes,\n attributeList: machineUser.attributeList,\n userType: \"USER_TYPE_MACHINE_USER\",\n });\n}\n","/**\n * Function type detection for test-run command\n *\n * Detects the function type (resolver, executor, workflow job, or plain function)\n * by dynamically importing the module and checking against known schemas.\n */\n\nimport { pathToFileURL } from \"node:url\";\nimport * as path from \"pathe\";\nimport { ExecutorSchema } from \"@/parser/service/executor\";\nimport { ResolverSchema } from \"@/parser/service/resolver\";\nimport { WorkflowJobSchema } from \"@/parser/service/workflow\";\n\nexport type FunctionType = \"resolver\" | \"executor\" | \"workflow-job\" | \"plain\";\n\n/** Minimal schema interface for local format detection (subset of TailorField) */\ninterface InputSchema {\n parse(args: { value: unknown; data: unknown; user: Record<string, unknown> }): {\n issues?: readonly { message: string; path?: readonly (string | number | symbol)[] }[];\n };\n}\n\nexport interface DetectedFunction {\n /** Detected function type */\n type: FunctionType;\n /** Function name (resolver name, executor name, job name, or filename-derived) */\n name: string;\n /** For workflow jobs: the TypeScript export name needed for bundling */\n exportName?: string;\n /** For plain functions: whether main is a named export rather than default export */\n namedMain?: boolean;\n /** For resolvers: whether the resolver defines an input schema */\n hasInput?: boolean;\n /** For resolvers with input: pre-built schema object with .parse() for local format detection */\n inputSchema?: InputSchema;\n}\n\ninterface DetectFunctionOptions {\n /** Absolute path to the function file */\n filePath: string;\n /** Workflow job name to select (matches the `name` field of createWorkflowJob) */\n jobName?: string;\n}\n\n/**\n * Detect the function type from a file by importing it and checking against schemas.\n * @param options - Detection options\n * @returns Detected function information\n */\nexport async function detectFunctionType(\n options: DetectFunctionOptions,\n): Promise<DetectedFunction> {\n const { filePath, jobName } = options;\n\n const module = await import(pathToFileURL(filePath).href);\n\n // Priority: resolver → executor → workflow job → plain function\n\n // 1. Check resolver\n const resolverResult = ResolverSchema.safeParse(module.default);\n if (resolverResult.success) {\n const rawInput = module.default.input;\n let inputSchema: DetectedFunction[\"inputSchema\"];\n if (rawInput) {\n // Build schema object for local format detection.\n const { t } = await import(\"@/configure/types\");\n inputSchema = t.object(rawInput) as InputSchema;\n }\n return {\n type: \"resolver\",\n name: resolverResult.data.name,\n hasInput: rawInput != null,\n inputSchema,\n };\n }\n\n // 2. Check executor (only function/jobFunction kinds)\n const executorResult = ExecutorSchema.safeParse(module.default);\n if (executorResult.success) {\n const { operation } = executorResult.data;\n if (operation.kind === \"function\" || operation.kind === \"jobFunction\") {\n return { type: \"executor\", name: executorResult.data.name };\n }\n }\n\n // 3. Check workflow jobs (scan all named exports)\n const workflowJobResult = detectWorkflowJob(module, jobName);\n if (workflowJobResult) {\n return workflowJobResult;\n }\n\n // 4. Check plain function (default export or named export \"main\")\n if (typeof module.default === \"function\") {\n const name = deriveNameFromPath(filePath);\n return { type: \"plain\", name };\n }\n\n if (typeof module.main === \"function\") {\n const name = deriveNameFromPath(filePath);\n return { type: \"plain\", name, namedMain: true };\n }\n\n throw new Error(\n `Could not detect function type from ${filePath}.\\n` +\n \"The file must have one of:\\n\" +\n \" - A default-exported resolver (createResolver)\\n\" +\n \" - A default-exported executor (createExecutor) with function/jobFunction operation\\n\" +\n \" - A named-exported workflow job (createWorkflowJob)\\n\" +\n \" - A default-exported function\\n\" +\n ' - A named-exported \"main\" function',\n );\n}\n\n/**\n * Scan all named exports for workflow jobs.\n * If jobName is specified, find the job whose `.name` matches.\n * If not specified and exactly one job exists, use it.\n * If multiple jobs exist, throw an error with the list.\n * @param module - The imported module\n * @param jobName - Workflow job name to select\n * @returns Detected function or null if no workflow jobs found\n */\nfunction detectWorkflowJob(\n module: Record<string, unknown>,\n jobName?: string,\n): DetectedFunction | null {\n const jobs: Array<{ name: string; exportName: string }> = [];\n\n for (const [exportName, exportValue] of Object.entries(module)) {\n if (exportName === \"default\") continue;\n const result = WorkflowJobSchema.safeParse(exportValue);\n if (result.success) {\n jobs.push({ name: result.data.name, exportName });\n }\n }\n\n if (jobs.length === 0) {\n return null;\n }\n\n if (jobName) {\n const match = jobs.find((j) => j.name === jobName);\n if (!match) {\n const available = jobs.map((j) => ` - \"${j.name}\" (export: ${j.exportName})`).join(\"\\n\");\n throw new Error(`Workflow job \"${jobName}\" not found. Available jobs:\\n${available}`);\n }\n return { type: \"workflow-job\", name: match.name, exportName: match.exportName };\n }\n\n if (jobs.length === 1) {\n return { type: \"workflow-job\", name: jobs[0].name, exportName: jobs[0].exportName };\n }\n\n const available = jobs.map((j) => ` - \"${j.name}\" (export: ${j.exportName})`).join(\"\\n\");\n throw new Error(`Multiple workflow jobs found. Specify one with --name:\\n${available}`);\n}\n\n/**\n * Derive a script name from a file path (filename without extension).\n * @param filePath - Absolute path to the function file\n * @returns Filename without extension\n */\nfunction deriveNameFromPath(filePath: string): string {\n return path.basename(filePath, path.extname(filePath));\n}\n","/**\n * `tailor-sdk function test-run` command\n *\n * Bundles and executes a function on the Tailor Platform server\n * without deploying (applying) the application.\n */\n\nimport * as fs from \"node:fs\";\nimport { create } from \"@bufbuild/protobuf\";\nimport { AuthInvokerSchema } from \"@tailor-proto/tailor/v1/auth_resource_pb\";\nimport * as path from \"pathe\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient, type OperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadConfig } from \"@/cli/shared/config-loader\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger, styles } from \"@/cli/shared/logger\";\nimport { executeScript } from \"@/cli/shared/script-executor\";\nimport { formatErrorWithSourcemap } from \"@/cli/shared/stack-trace\";\nimport { bundleForTestRun, type ResolvedMachineUser } from \"./bundle\";\nimport { detectFunctionType, type DetectedFunction } from \"./detect\";\n\nexport const testRunCommand = defineAppCommand({\n name: \"test-run\",\n description: \"Run a function on the Tailor Platform server without deploying.\",\n args: z.object({\n ...workspaceArgs,\n file: arg(z.string(), {\n positional: true,\n description: \"Path to the function file\",\n }),\n name: arg(z.string().optional(), {\n alias: \"n\",\n description: \"Workflow job name to run (matches the `name` field of createWorkflowJob)\",\n }),\n arg: arg(z.string().optional(), {\n alias: \"a\",\n description: \"JSON argument to pass to the function\",\n }),\n \"machine-user\": arg(z.string().optional(), {\n alias: \"m\",\n description: \"Machine user name for authentication\",\n env: \"TAILOR_PLATFORM_MACHINE_USER_NAME\",\n }),\n config: arg(z.string().default(\"tailor.config.ts\"), {\n alias: \"c\",\n description: \"Path to SDK config file\",\n }),\n }),\n notes: `You can pass either a source file (\\`.ts\\`) or a pre-bundled file (\\`.js\\`).\nWhen a \\`.js\\` file is provided, detection and bundling are skipped and the file is executed as-is.\n\n> [!WARNING]\n> Workflow job \\`.trigger()\\` calls do not work in test-run mode.\n> Triggered jobs are not executed; only the target job's \\`body\\` function runs in isolation.`,\n examples: [\n {\n cmd: 'resolvers/add.ts --arg \\'{\"a\":1,\"b\":2}\\'',\n desc: \"Run a resolver with input arguments\",\n },\n {\n cmd: \"workflows/sample.ts --name validate-order\",\n desc: \"Run a specific workflow job by name\",\n },\n {\n cmd: 'build/resolvers/add.js --arg \\'{\"a\":1,\"b\":2}\\'',\n desc: \"Run a pre-bundled .js file directly\",\n },\n ],\n run: async (args) => {\n const jsonOutput = logger.jsonMode;\n\n // 1. Resolve and validate file path\n const filePath = path.resolve(args.file);\n if (!fs.existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n // 2. Load config (required)\n const { config } = await loadConfig(args.config);\n\n // 3. Resolve auth, workspace, and machine user info (needed before bundling)\n const authNamespace = resolveAuthNamespace(config.auth);\n const machineUserName = resolveMachineUserName(args[\"machine-user\"], config.auth);\n\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n const machineUser = await resolveMachineUser({\n client,\n workspaceId,\n authNamespace,\n machineUserName,\n authConfig: config.auth,\n });\n\n // 4. Resolve bundled code and script name\n const relativePath = path.relative(process.cwd(), filePath);\n const isPreBundled = filePath.endsWith(\".js\");\n let bundledCode: string;\n let scriptName: string;\n let functionType: string | undefined;\n let functionName: string | undefined;\n\n if (isPreBundled) {\n // Pre-bundled .js file\n scriptName = path.basename(filePath);\n bundledCode = fs.readFileSync(filePath, \"utf-8\");\n logger.info(`Using pre-bundled script ${styles.bold(scriptName)}`);\n } else {\n // Source file: detect type and bundle\n logger.info(`Detecting function type from ${styles.path(relativePath)}`);\n\n const detected = await detectFunctionType({\n filePath,\n jobName: args.name,\n });\n\n functionType = detected.type;\n functionName = detected.name;\n logger.info(`Detected: ${styles.bold(detected.type)} ${styles.info(`\"${detected.name}\"`)}`);\n\n if (detected.type === \"resolver\" && args.arg) {\n if (!detected.hasInput) {\n logger.warn(\n '--arg is ignored because this resolver has no input schema. Define \"input\" in your resolver to use --arg.',\n );\n args.arg = undefined;\n } else if (detected.inputSchema) {\n args.arg = resolveResolverArg(args.arg, detected.inputSchema, machineUser, workspaceId);\n }\n }\n\n logger.info(\"Bundling...\");\n ({ bundledCode, scriptName } = await bundleForTestRun({\n detected,\n sourceFile: filePath,\n env: config.env ?? {},\n inlineSourcemap: config.inlineSourcemap,\n logLevel: config.logLevel,\n machineUser,\n workspaceId,\n }));\n logger.info(`Bundled as ${styles.bold(scriptName)}`);\n }\n\n // 5. Execute via TestExecScript\n const authInvoker = create(AuthInvokerSchema, {\n namespace: authNamespace,\n machineUserName: machineUser.name,\n });\n\n logger.info(`Executing on workspace ${styles.dim(workspaceId)}...`);\n\n const result = await executeScript({\n client,\n workspaceId,\n name: scriptName,\n code: bundledCode,\n arg: args.arg,\n invoker: authInvoker,\n });\n\n // 7. Display result\n if (jsonOutput) {\n logger.out({\n success: result.success,\n scriptName,\n functionType,\n functionName,\n logs: result.logs,\n result: result.result,\n error: result.error,\n });\n } else {\n if (result.success) {\n logger.success(\"Execution succeeded\");\n } else {\n logger.error(\"Execution failed\");\n }\n\n if (result.logs?.trim()) {\n logger.log(styles.bold(\"\\nLogs:\"));\n for (const line of result.logs.split(\"\\n\")) {\n logger.log(` ${line}`);\n }\n }\n\n if (result.result && result.success) {\n logger.log(styles.bold(\"\\nResult:\"));\n try {\n const parsed = JSON.parse(result.result);\n logger.log(` ${JSON.stringify(parsed, null, 2).split(\"\\n\").join(\"\\n \")}`);\n } catch {\n logger.log(` ${result.result}`);\n }\n }\n\n if (result.error && !result.success) {\n logger.log(styles.bold(\"\\nError:\"));\n const formatted = formatErrorWithSourcemap(result.error, bundledCode, process.cwd());\n if (formatted) {\n logger.log(formatted);\n } else {\n logger.log(` ${styles.error(result.error)}`);\n }\n }\n }\n\n if (!result.success) {\n process.exit(1);\n }\n },\n});\n\n/**\n * Resolve auth namespace from config.\n * @param authConfig - Auth configuration from tailor.config.ts\n * @returns Resolved auth namespace\n */\nfunction resolveAuthNamespace(\n authConfig: { name: string; external?: boolean } | undefined,\n): string {\n if (authConfig?.name) {\n return authConfig.name;\n }\n throw new Error(\"Auth namespace is required. Ensure tailor.config.ts has an auth config.\");\n}\n\n/**\n * Resolve machine user name from CLI args or config. Priority: --machine-user > first key of config.auth.machineUsers\n * @param cliMachineUser - CLI --machine-user value\n * @param authConfig - Auth configuration from tailor.config.ts\n * @returns Resolved machine user name\n */\nfunction resolveMachineUserName(\n cliMachineUser: string | undefined,\n authConfig:\n | { name: string; external?: boolean; machineUsers?: Record<string, unknown> }\n | undefined,\n): string {\n if (cliMachineUser) {\n return cliMachineUser;\n }\n if (authConfig && !(\"external\" in authConfig && authConfig.external)) {\n const machineUsers = authConfig.machineUsers;\n if (machineUsers) {\n const keys = Object.keys(machineUsers);\n if (keys.length > 0) {\n return keys[0];\n }\n }\n }\n throw new Error(\n \"Machine user is required. Provide --machine-user or ensure tailor.config.ts has machine users configured.\",\n );\n}\n\ninterface ResolveMachineUserOptions {\n client: OperatorClient;\n workspaceId: string;\n authNamespace: string;\n machineUserName: string;\n authConfig:\n | { name: string; external?: boolean; machineUsers?: Record<string, unknown> }\n | undefined;\n}\n\n/**\n * Resolve full machine user info: name, id (from API), and attributes (from config).\n * @param options - Options for resolving machine user\n * @returns Resolved machine user with id, attributes, and attributeList\n */\nasync function resolveMachineUser(\n options: ResolveMachineUserOptions,\n): Promise<ResolvedMachineUser> {\n const { client, workspaceId, authNamespace, machineUserName, authConfig } = options;\n\n // Get machine user ID from the server\n let id = \"00000000-0000-0000-0000-000000000000\";\n try {\n const { machineUser } = await client.getAuthMachineUser({\n workspaceId,\n authNamespace,\n name: machineUserName,\n });\n if (machineUser?.id) {\n id = machineUser.id;\n }\n } catch {\n logger.debug(`Could not fetch machine user \"${machineUserName}\" from server, using nil UUID`);\n }\n\n // Get attributes from config\n const machineUserConfig = authConfig?.machineUsers?.[machineUserName];\n let attributes: Record<string, unknown> | null = null;\n let attributeList: unknown[] = [];\n if (machineUserConfig && typeof machineUserConfig === \"object\") {\n const cfg = machineUserConfig as {\n attributes?: Record<string, unknown>;\n attributeList?: unknown[];\n };\n attributes = cfg.attributes ?? null;\n attributeList = cfg.attributeList ?? [];\n }\n\n return { name: machineUserName, id, attributes, attributeList };\n}\n\n/**\n * Resolve resolver arg format: detect and unwrap deprecated {\"input\":{...}} wrapper.\n * Tries new format (arg = input fields) first via schema parse.\n * If that fails and arg looks like old format, tries unwrapping.\n * @param argStr - JSON string of the arg\n * @param inputSchema - Pre-built schema object from detect (has .parse())\n * @param machineUser - Resolved machine user info\n * @param workspaceId - Workspace ID\n * @returns Resolved JSON string (unwrapped if old format)\n */\nexport function resolveResolverArg(\n argStr: string,\n inputSchema: NonNullable<DetectedFunction[\"inputSchema\"]>,\n machineUser: ResolvedMachineUser,\n workspaceId: string,\n): string {\n const parsed = JSON.parse(argStr);\n const user = {\n id: machineUser.id,\n type: \"machine_user\" as const,\n workspaceId,\n attributes: machineUser.attributes ?? null,\n attributeList: machineUser.attributeList ?? [],\n };\n\n const newResult = inputSchema.parse({ value: parsed, data: parsed, user });\n if (!newResult.issues) {\n return argStr;\n }\n\n // New format failed — check if old format works\n if (\n Object.keys(parsed).length === 1 &&\n parsed.input != null &&\n typeof parsed.input === \"object\" &&\n !Array.isArray(parsed.input)\n ) {\n const oldResult = inputSchema.parse({ value: parsed.input, data: parsed.input, user });\n if (!oldResult.issues) {\n logger.warn(\n '[DEPRECATED] Wrapping args with \"input\" key (e.g. {\"input\":{...}}) is deprecated. Pass input fields directly (e.g. {\"a\":1}). The \"input\" wrapper will be removed in v2.',\n );\n return JSON.stringify(parsed.input);\n }\n }\n\n // Both failed — pass as-is, let server report the validation error\n return argStr;\n}\n","import { defineCommand, runCommand } from \"politty\";\nimport { getCommand } from \"./get\";\nimport { listCommand } from \"./list\";\nimport { logsCommand } from \"./logs\";\nimport { testRunCommand } from \"./test-run\";\n\nexport const functionCommand = defineCommand({\n name: \"function\",\n description: \"Manage functions\",\n subCommands: {\n get: getCommand,\n list: listCommand,\n logs: logsCommand,\n \"test-run\": testRunCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { generate } from \"@/cli/commands/generate/service\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\n\nexport const generateCommand = defineAppCommand({\n name: \"generate\",\n description: \"Generate files using Tailor configuration.\",\n args: z\n .object({\n config: arg(z.string().default(\"tailor.config.ts\"), {\n alias: \"c\",\n description: \"Path to SDK config file\",\n }),\n watch: arg(z.boolean().default(false), {\n alias: \"W\",\n description: \"Watch for type/resolver changes and regenerate\",\n }),\n })\n .strict(),\n run: async (args) => {\n const { initTelemetry } = await import(\"@/cli/telemetry\");\n await initTelemetry();\n await generate({\n configPath: args.config,\n watch: args.watch,\n });\n },\n});\n","import { spawnSync } from \"node:child_process\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { readPackageJson } from \"@/cli/shared/package-json\";\n\nconst detectPackageManager = () => {\n const availablePMs = [\"npm\", \"yarn\", \"pnpm\", \"bun\"];\n const userAgent = process.env.npm_config_user_agent;\n if (!userAgent) return;\n const [name] = userAgent.split(\"/\");\n if (!availablePMs.includes(name)) return;\n return name;\n};\n\nexport const initCommand = defineAppCommand({\n name: \"init\",\n description: \"Initialize a new project using create-sdk.\",\n args: z\n .object({\n name: arg(z.string().optional(), {\n positional: true,\n description: \"Project name\",\n }),\n template: arg(z.string().optional(), {\n alias: \"t\",\n description: \"Template name\",\n }),\n })\n .strict(),\n run: async (args) => {\n const packageJson = await readPackageJson();\n const version =\n packageJson.version && packageJson.version !== \"0.0.0\" ? packageJson.version : \"latest\";\n\n let packageManager = detectPackageManager();\n if (!packageManager) {\n logger.warn(\"Could not detect package manager, defaulting to npm\");\n packageManager = \"npm\";\n }\n const initArgs = [\n \"create\",\n `@tailor-platform/sdk@${version}`,\n ...(args.name ? [args.name] : []),\n ...(packageManager === \"npm\" ? [\"--\"] : []),\n ...(args.template ? [\"--template\", args.template] : []),\n ];\n logger.log(`Running: ${packageManager} ${initArgs.join(\" \")}`);\n\n spawnSync(packageManager, initArgs, { stdio: \"inherit\" });\n },\n});\n","import * as crypto from \"node:crypto\";\nimport * as http from \"node:http\";\nimport { generateCodeVerifier } from \"@badgateway/oauth2-client\";\nimport open from \"open\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport {\n closeConnectionPool,\n fetchPlatformMachineUserToken,\n fetchUserInfo,\n initOAuth2Client,\n} from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { readPlatformConfig, saveUserTokens, writePlatformConfig } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { prompt } from \"@/cli/shared/prompt\";\n\nconst redirectPort = 8085;\nconst redirectUri = `http://localhost:${redirectPort}/callback`;\n\nfunction randomState() {\n return crypto.randomBytes(32).toString(\"base64url\");\n}\n\nconst startAuthServer = async () => {\n const client = initOAuth2Client();\n const state = randomState();\n const codeVerifier = await generateCodeVerifier();\n\n return new Promise<void>((resolve, reject) => {\n const server = http.createServer(async (req, res) => {\n try {\n if (!req.url?.startsWith(\"/callback\")) {\n throw new Error(\"Invalid callback URL\");\n }\n const tokens = await client.authorizationCode.getTokenFromCodeRedirect(\n `http://${req.headers.host}${req.url}`,\n {\n redirectUri: redirectUri,\n state,\n codeVerifier,\n },\n );\n const userInfo = await fetchUserInfo(tokens.accessToken);\n\n const pfConfig = await readPlatformConfig();\n await saveUserTokens(\n pfConfig,\n userInfo.email,\n {\n accessToken: tokens.accessToken,\n refreshToken: tokens.refreshToken ?? undefined,\n },\n new Date(tokens.expiresAt!).toISOString(),\n );\n pfConfig.current_user = userInfo.email;\n writePlatformConfig(pfConfig);\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n status: \"ok\",\n message: \"Successfully authenticated. Please close this window.\",\n }),\n );\n resolve();\n } catch (error) {\n res.writeHead(401);\n res.end(\"Authentication failed\");\n reject(error);\n } finally {\n // Close the server after handling one request.\n server.close();\n }\n });\n\n const timeout = setTimeout(\n () => {\n server.close();\n reject(new Error(\"Login timeout exceeded\"));\n },\n 5 * 60 * 1000,\n );\n\n server.on(\"close\", () => {\n clearTimeout(timeout);\n });\n\n server.on(\"error\", (error) => {\n reject(error);\n });\n\n server.listen(redirectPort, async () => {\n const authorizeUri = await client.authorizationCode.getAuthorizeUri({\n redirectUri,\n state,\n codeVerifier,\n });\n\n logger.info(`Opening browser for login:\\n\\n${authorizeUri}\\n`);\n try {\n await open(authorizeUri);\n } catch {\n logger.warn(\"Failed to open browser automatically. Please open the URL above manually.\");\n }\n });\n });\n};\n\nasync function loginAsMachineUser(args: { clientId: string; clientSecret?: string }) {\n const clientSecret = args.clientSecret ?? (await prompt.password({ message: \"Client secret\" }));\n const tokens = await fetchPlatformMachineUserToken(args.clientId, clientSecret);\n\n const pfConfig = await readPlatformConfig();\n await saveUserTokens(\n pfConfig,\n args.clientId,\n { accessToken: tokens.accessToken },\n new Date(tokens.expiresAt!).toISOString(),\n );\n pfConfig.current_user = args.clientId;\n writePlatformConfig(pfConfig);\n}\n\nexport const loginCommand = defineAppCommand({\n name: \"login\",\n description: \"Login to Tailor Platform.\",\n args: z.xor([\n z.object({}).strict().describe(\"User Login\"),\n z\n .object({\n \"machine-user\": arg(z.literal(true), {\n hiddenAlias: \"machineuser\",\n description: \"Login as a platform machine user.\",\n required: true,\n }),\n \"client-id\": arg(z.string(), {\n description: \"Client ID\",\n env: \"TAILOR_PLATFORM_MACHINE_USER_CLIENT_ID\",\n required: true,\n }),\n \"client-secret\": arg(z.string().optional(), {\n description: \"Client secret\",\n env: \"TAILOR_PLATFORM_MACHINE_USER_CLIENT_SECRET\",\n }),\n })\n .strict()\n .describe(\"Machine User Login\"),\n ]),\n run: async (args) => {\n if (\"machine-user\" in args && args[\"machine-user\"]) {\n await loginAsMachineUser({\n clientId: args.clientId,\n clientSecret: args.clientSecret,\n });\n } else {\n await startAuthServer();\n }\n logger.success(\"Successfully logged in to Tailor Platform.\");\n await closeConnectionPool();\n },\n});\n","import { z } from \"zod\";\nimport { initOAuth2Client } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport {\n deleteUserTokens,\n readPlatformConfig,\n resolveTokens,\n writePlatformConfig,\n} from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\n\nexport const logoutCommand = defineAppCommand({\n name: \"logout\",\n description: \"Logout from Tailor Platform.\",\n args: z.object({}).strict(),\n run: async () => {\n const pfConfig = await readPlatformConfig();\n const userEntry = pfConfig.current_user ? pfConfig.users[pfConfig.current_user] : undefined;\n if (!userEntry) {\n logger.info(\"You are not logged in.\");\n return;\n }\n\n try {\n const { accessToken, refreshToken } = await resolveTokens(userEntry, pfConfig.current_user!);\n const client = initOAuth2Client();\n const tokenTypeHint = refreshToken ? \"refresh_token\" : \"access_token\";\n await client.revoke(\n {\n accessToken,\n refreshToken: refreshToken ?? null,\n expiresAt: Date.parse(userEntry.token_expires_at),\n },\n tokenTypeHint,\n );\n } catch (error) {\n logger.warn(`Failed to revoke token: ${error instanceof Error ? error.message : error}`);\n }\n\n await deleteUserTokens(pfConfig, pfConfig.current_user!);\n delete pfConfig.users[pfConfig.current_user!];\n pfConfig.current_user = null;\n writePlatformConfig(pfConfig);\n logger.success(\"Successfully logged out from Tailor Platform.\");\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { listCommand } from \"./list\";\nimport { tokenCommand } from \"./token\";\n\nexport const machineuserCommand = defineCommand({\n name: \"machineuser\",\n description: \"Manage machine users in your Tailor Platform application.\",\n subCommands: {\n list: listCommand,\n token: tokenCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { getCommand } from \"./get\";\nimport { listCommand } from \"./list\";\n\nexport const oauth2clientCommand = defineCommand({\n name: \"oauth2client\",\n description: \"Manage OAuth2 clients in your Tailor Platform application.\",\n subCommands: {\n list: listCommand,\n get: getCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import open from \"open\";\nimport { z } from \"zod\";\nimport { deploymentArgs } from \"@/cli/shared/args\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadConfig } from \"@/cli/shared/config-loader\";\nimport { loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\n\nconst consoleBaseUrl = \"https://console.tailor.tech\";\n\nexport const openCommand = defineAppCommand({\n name: \"open\",\n description: \"Open Tailor Platform Console.\",\n args: z\n .object({\n ...deploymentArgs,\n })\n .strict(),\n run: async (args) => {\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n const { config } = await loadConfig(args.config);\n const applicationName = config.name;\n const consolePath = `/workspaces/${workspaceId}/applications/${encodeURIComponent(applicationName)}/overview`;\n const consoleUrl = new URL(consolePath, consoleBaseUrl).toString();\n const jsonOutput = logger.jsonMode;\n\n logger.info(\"Opening Tailor Platform Console...\");\n\n let opened = true;\n try {\n await open(consoleUrl);\n } catch {\n opened = false;\n }\n\n if (jsonOutput) {\n logger.out({ consoleUrl, workspaceId, applicationName, opened });\n return;\n }\n\n if (opened) {\n logger.out(`Console URL: ${consoleUrl}`);\n logger.out(`Workspace ID: ${workspaceId}`);\n logger.out(`Application Name: ${applicationName}`);\n } else {\n logger.warn(\n `Failed to open browser automatically. Please open this URL manually:\\n${consoleUrl}`,\n );\n }\n },\n});\n","import { defineCommand } from \"politty\";\nimport { createCommand } from \"./create\";\nimport { deleteCommand } from \"./delete\";\nimport { getCommand } from \"./get\";\nimport { listCommand } from \"./list\";\nimport { updateCommand } from \"./update\";\n\nexport const folderCommand = defineCommand({\n name: \"folder\",\n description: \"Manage organization folders.\",\n subCommands: {\n create: createCommand,\n delete: deleteCommand,\n get: getCommand,\n list: listCommand,\n update: updateCommand,\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { folderCommand } from \"./folder\";\nimport { getCommand } from \"./get\";\nimport { listCommand } from \"./list\";\nimport { treeCommand } from \"./tree\";\nimport { updateCommand } from \"./update\";\n\nexport const organizationCommand = defineCommand({\n name: \"organization\",\n description: \"Manage Tailor Platform organizations.\",\n subCommands: {\n folder: folderCommand,\n get: getCommand,\n list: listCommand,\n tree: treeCommand,\n update: updateCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { fetchAll, initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { fetchLatestToken, readPlatformConfig, writePlatformConfig } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport type { ProfileInfo } from \"./types\";\n\nexport const createCommand = defineAppCommand({\n name: \"create\",\n description: \"Create a new profile.\",\n args: z\n .object({\n name: arg(z.string(), {\n positional: true,\n description: \"Profile name\",\n }),\n user: arg(z.string(), {\n alias: \"u\",\n description: \"User email\",\n }),\n \"workspace-id\": arg(z.string(), {\n alias: \"w\",\n description: \"Workspace ID\",\n }),\n permission: arg(z.enum([\"write\", \"read\"]).default(\"write\"), {\n description:\n \"Profile permission. 'read' blocks all write commands while the profile is active.\",\n }),\n })\n .strict(),\n run: async (args) => {\n const config = await readPlatformConfig();\n\n // Check if profile already exists\n if (config.profiles[args.name]) {\n throw new Error(`Profile \"${args.name}\" already exists.`);\n }\n\n // Check if user exists\n const token = await fetchLatestToken(config, args.user);\n\n // Check if workspace exists\n const client = await initOperatorClient(token);\n const workspaces = await fetchAll(async (pageToken, maxPageSize) => {\n const { workspaces, nextPageToken } = await client.listWorkspaces({\n pageToken,\n pageSize: maxPageSize,\n });\n return [workspaces, nextPageToken];\n });\n\n const workspace = workspaces.find((ws) => ws.id === args[\"workspace-id\"]);\n if (!workspace) {\n throw new Error(`Workspace \"${args[\"workspace-id\"]}\" not found.`);\n }\n\n // Create new profile\n config.profiles[args.name] = {\n user: args.user,\n workspace_id: args[\"workspace-id\"],\n ...(args.permission === \"read\" ? { readonly: true } : {}),\n };\n writePlatformConfig(config);\n\n if (!args.json) {\n logger.success(`Profile \"${args.name}\" created successfully.`);\n }\n\n // Show profile info\n const profileInfo: ProfileInfo = {\n name: args.name,\n user: args.user,\n workspaceId: args[\"workspace-id\"],\n permission: args.permission,\n };\n logger.out(profileInfo);\n },\n});\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { readPlatformConfig, writePlatformConfig } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\n\nexport const deleteCommand = defineAppCommand({\n name: \"delete\",\n description: \"Delete a profile.\",\n args: z\n .object({\n name: arg(z.string(), {\n positional: true,\n description: \"Profile name\",\n }),\n })\n .strict(),\n run: async (args) => {\n const config = await readPlatformConfig();\n\n // Check if profile exists\n if (!config.profiles[args.name]) {\n throw new Error(`Profile \"${args.name}\" not found.`);\n }\n\n // Delete profile\n delete config.profiles[args.name];\n writePlatformConfig(config);\n\n logger.success(`Profile \"${args.name}\" deleted successfully.`);\n },\n});\n","import { z } from \"zod\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { readPlatformConfig } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport ml from \"@/utils/multiline\";\nimport type { ProfileInfo } from \"./types\";\n\nexport const listCommand = defineAppCommand({\n name: \"list\",\n description: \"List all profiles.\",\n args: z.object({}).strict(),\n run: async () => {\n const config = await readPlatformConfig();\n const jsonOutput = logger.jsonMode;\n\n const profiles = Object.entries(config.profiles);\n if (profiles.length === 0) {\n logger.info(ml`\n No profiles found.\n Please create a profile first using 'tailor-sdk profile create' command.\n `);\n if (jsonOutput) {\n logger.out([]);\n }\n return;\n }\n\n const profileInfos: ProfileInfo[] = profiles.map(([name, profile]) => ({\n name,\n user: profile!.user,\n workspaceId: profile!.workspace_id,\n permission: profile!.readonly === true ? \"read\" : \"write\",\n }));\n logger.out(profileInfos);\n },\n});\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { fetchAll, initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { fetchLatestToken, readPlatformConfig, writePlatformConfig } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport type { ProfileInfo } from \"./types\";\n\nexport const updateCommand = defineAppCommand({\n name: \"update\",\n description: \"Update profile properties.\",\n args: z\n .object({\n name: arg(z.string(), {\n positional: true,\n description: \"Profile name\",\n }),\n user: arg(z.string().optional(), {\n alias: \"u\",\n description: \"New user email\",\n }),\n \"workspace-id\": arg(z.string().optional(), {\n alias: \"w\",\n description: \"New workspace ID\",\n }),\n permission: arg(z.enum([\"write\", \"read\"]).optional(), {\n description:\n \"Profile permission. 'read' blocks all write commands; 'write' lifts the restriction.\",\n }),\n })\n .strict(),\n run: async (args) => {\n const config = await readPlatformConfig();\n\n // Check if profile exists\n if (!config.profiles[args.name]) {\n throw new Error(`Profile \"${args.name}\" not found.`);\n }\n\n // Check if at least one property is provided\n if (!args.user && !args[\"workspace-id\"] && args.permission === undefined) {\n throw new Error(\"Please provide at least one property to update.\");\n }\n\n const profile = config.profiles[args.name]!;\n const oldUser = profile.user;\n const newUser = args.user || oldUser;\n const oldWorkspaceId = profile.workspace_id;\n const newWorkspaceId = args[\"workspace-id\"] || oldWorkspaceId;\n\n // Skip remote validation when neither user nor workspace is changing.\n // This keeps `profile update <name> --permission write|read` working\n // offline and when the saved token is expired or the workspace has been\n // removed, important so a user can always lift their own readonly flag.\n if (args.user !== undefined || args[\"workspace-id\"] !== undefined) {\n // Check if user exists\n const token = await fetchLatestToken(config, newUser);\n\n // Check if workspace exists\n const client = await initOperatorClient(token);\n const workspaces = await fetchAll(async (pageToken, maxPageSize) => {\n const { workspaces, nextPageToken } = await client.listWorkspaces({\n pageToken,\n pageSize: maxPageSize,\n });\n return [workspaces, nextPageToken];\n });\n const workspace = workspaces.find((ws) => ws.id === newWorkspaceId);\n if (!workspace) {\n throw new Error(`Workspace \"${newWorkspaceId}\" not found.`);\n }\n }\n\n // Update properties\n profile.user = newUser;\n profile.workspace_id = newWorkspaceId;\n if (args.permission === \"read\") {\n profile.readonly = true;\n } else if (args.permission === \"write\") {\n delete profile.readonly;\n }\n writePlatformConfig(config);\n if (!args.json) {\n logger.success(`Profile \"${args.name}\" updated successfully`);\n }\n\n // Show profile info\n const profileInfo: ProfileInfo = {\n name: args.name,\n user: newUser,\n workspaceId: newWorkspaceId,\n permission: profile.readonly === true ? \"read\" : \"write\",\n };\n logger.out(profileInfo);\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { createCommand } from \"./create\";\nimport { deleteCommand } from \"./delete\";\nimport { listCommand } from \"./list\";\nimport { updateCommand } from \"./update\";\n\nexport type { ProfileInfo } from \"./types\";\n\nexport const profileCommand = defineCommand({\n name: \"profile\",\n description: \"Manage workspace profiles (user + workspace combinations).\",\n subCommands: {\n create: createCommand,\n delete: deleteCommand,\n list: listCommand,\n update: updateCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\n\n/**\n * Arguments for specify secret key\n */\nexport const vaultArgs = {\n \"vault-name\": arg(z.string(), {\n alias: \"V\",\n description: \"Vault name\",\n }),\n};\n\n/**\n * Arguments for specify secret key\n */\nexport const secretIdentifyArgs = {\n ...vaultArgs,\n name: arg(z.string(), {\n alias: \"n\",\n description: \"Secret name\",\n }),\n};\n\n/**\n * Arguments for specify secret key\n */\nexport const secretValueArgs = {\n ...secretIdentifyArgs,\n value: arg(z.string(), {\n alias: \"v\",\n description: \"Secret value\",\n }),\n};\n","import { resourceTrn, sdkNameLabelKey } from \"@/cli/commands/deploy/label\";\nimport { logger } from \"@/cli/shared/logger\";\nimport type { OperatorClient } from \"@/cli/shared/client\";\n\ntype CheckVaultManagedParams = {\n client: OperatorClient;\n workspaceId: string;\n vaultName: string;\n};\n\ntype CheckVaultManagedResult = {\n isManaged: boolean;\n trn: string;\n existingLabels: Record<string, string>;\n};\n\n/**\n * Check if a vault is managed by defineSecretManager() and warn the user.\n * Returns management status and metadata needed for releasing ownership.\n * @param params - Check parameters\n * @returns Management status, TRN, and existing labels\n */\nexport async function checkVaultManaged(\n params: CheckVaultManagedParams,\n): Promise<CheckVaultManagedResult> {\n const { client, workspaceId, vaultName } = params;\n const trn = resourceTrn(workspaceId, \"vault\", vaultName);\n const notManaged = { isManaged: false, trn, existingLabels: {} };\n\n let owner: string | undefined;\n let allLabels: Record<string, string>;\n try {\n const { metadata } = await client.getMetadata({ trn });\n allLabels = metadata?.labels ?? {};\n owner = allLabels[sdkNameLabelKey];\n } catch {\n // If metadata fetch fails (e.g., vault doesn't exist yet), proceed silently.\n // The actual operation will surface the appropriate error.\n return notManaged;\n }\n\n if (!owner) return notManaged;\n\n logger.warn(\n `Vault \"${vaultName}\" is managed by defineSecretManager() in tailor.config.ts (owner: \"${owner}\"). ` +\n `Changes made via CLI may conflict with the config on the next apply.`,\n );\n\n return { isManaged: true, trn, existingLabels: allLabels };\n}\n\n/**\n * Release ownership of a managed vault by removing SDK labels from metadata.\n * Call this after the user has confirmed they want to proceed with a CLI operation on a managed vault.\n * @param params - Client, TRN, and existing labels from checkVaultManaged result\n * @param params.client - Operator client used to update vault metadata\n * @param params.trn - TRN of the vault resource\n * @param params.existingLabels - Existing metadata labels on the vault before release\n */\nexport async function releaseVaultOwnership(params: {\n client: OperatorClient;\n trn: string;\n existingLabels: Record<string, string>;\n}): Promise<void> {\n const { client, trn, existingLabels } = params;\n const { [sdkNameLabelKey]: _, \"sdk-version\": __, ...remainingLabels } = existingLabels;\n await client.setMetadata({ trn, labels: remainingLabels });\n logger.info(\n \"Config ownership has been removed from this vault. \" +\n \"Remove it from defineSecretManager() in your config to prevent the next apply from re-claiming it.\",\n );\n}\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { z } from \"zod\";\nimport { confirmationArgs, workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { prompt } from \"@/cli/shared/prompt\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport { secretValueArgs } from \"./args\";\nimport { checkVaultManaged, releaseVaultOwnership } from \"./check-vault-managed\";\n\nexport const createSecretCommand = defineAppCommand({\n name: \"create\",\n description: \"Create a secret in a vault.\",\n args: z\n .object({\n ...workspaceArgs,\n ...secretValueArgs,\n ...confirmationArgs,\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n const managed = await checkVaultManaged({\n client,\n workspaceId,\n vaultName: args[\"vault-name\"],\n });\n if (managed.isManaged && !args.yes) {\n const confirmed = await prompt.confirm({\n message: \"Do you want to proceed?\",\n default: false,\n });\n if (!confirmed) return;\n }\n try {\n await client.createSecretManagerSecret({\n workspaceId,\n secretmanagerVaultName: args[\"vault-name\"],\n secretmanagerSecretName: args.name,\n secretmanagerSecretValue: args.value,\n });\n } catch (error) {\n if (error instanceof ConnectError) {\n if (error.code === Code.NotFound) {\n throw new Error(`Vault \"${args[\"vault-name\"]}\" not found.`, { cause: error });\n }\n if (error.code === Code.AlreadyExists) {\n throw new Error(`Secret \"${args.name}\" already exists.`, { cause: error });\n }\n }\n throw error;\n }\n\n if (managed.isManaged) {\n await releaseVaultOwnership({ client, ...managed });\n }\n\n logger.success(`Secret: ${args.name} created in vault: ${args[\"vault-name\"]}`);\n },\n});\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { z } from \"zod\";\nimport { confirmationArgs, workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { prompt } from \"@/cli/shared/prompt\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport { secretIdentifyArgs } from \"./args\";\nimport { checkVaultManaged, releaseVaultOwnership } from \"./check-vault-managed\";\n\nexport const deleteSecretCommand = defineAppCommand({\n name: \"delete\",\n description: \"Delete a secret in a vault.\",\n args: z\n .object({\n ...workspaceArgs,\n ...secretIdentifyArgs,\n ...confirmationArgs,\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n // No additional confirmation for managed vaults — the name-typing confirmation below is a stronger guard.\n const managed = await checkVaultManaged({ client, workspaceId, vaultName: args[\"vault-name\"] });\n\n if (!args.yes) {\n const confirmation = await prompt.text({\n message: `Enter the secret name to confirm deletion (\"${args.name}\"):`,\n });\n\n if (confirmation !== args.name) {\n logger.info(\"Secret deletion cancelled.\");\n return;\n }\n }\n\n try {\n await client.deleteSecretManagerSecret({\n workspaceId,\n secretmanagerVaultName: args[\"vault-name\"],\n secretmanagerSecretName: args.name,\n });\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(`Secret \"${args.name}\" not found in vault \"${args[\"vault-name\"]}\".`, {\n cause: error,\n });\n }\n throw error;\n }\n\n if (managed.isManaged) {\n await releaseVaultOwnership({ client, ...managed });\n }\n\n logger.success(`Secret: ${args.name} deleted from vault: ${args[\"vault-name\"]}`);\n },\n});\n","import { timestampDate } from \"@bufbuild/protobuf/wkt\";\nimport { Code, ConnectError } from \"@connectrpc/connect\";\nimport { z } from \"zod\";\nimport { type Order, paginationArgs, toPageDirection, workspaceArgs } from \"@/cli/shared/args\";\nimport { fetchPaged, initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { vaultArgs } from \"./args\";\nimport type { SecretManagerSecret } from \"@tailor-proto/tailor/v1/secret_manager_resource_pb\";\n\nexport interface SecretListOptions {\n workspaceId?: string;\n profile?: string;\n vaultName: string;\n order?: Order;\n limit?: number;\n}\n\nexport interface SecretInfo {\n name: string;\n createdAt: Date | null;\n updatedAt: Date | null;\n}\n\nfunction secretInfo(secret: SecretManagerSecret): SecretInfo {\n return {\n name: secret.name,\n createdAt: secret.createTime ? timestampDate(secret.createTime) : null,\n updatedAt: secret.updateTime ? timestampDate(secret.updateTime) : null,\n };\n}\n\n/**\n * List secrets in a Secret Manager vault.\n * @param options - Secret listing options\n * @returns List of secrets\n */\nasync function secretList(options: SecretListOptions): Promise<SecretInfo[]> {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: options.workspaceId,\n profile: options.profile,\n });\n\n const pageDirection = toPageDirection(options.order);\n const secrets = await fetchPaged(\n async (pageToken, pageSize) => {\n const { secrets, nextPageToken } = await client.listSecretManagerSecrets({\n workspaceId,\n secretmanagerVaultName: options.vaultName,\n pageToken,\n pageSize,\n pageDirection,\n });\n return [secrets, nextPageToken];\n },\n { limit: options.limit },\n );\n\n return secrets.map(secretInfo);\n}\n\nexport const listSecretCommand = defineAppCommand({\n name: \"list\",\n description: \"List all secrets in a vault.\",\n args: z\n .object({\n ...workspaceArgs,\n ...vaultArgs,\n ...paginationArgs(),\n })\n .strict(),\n run: async (args) => {\n try {\n const secrets = await secretList({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n vaultName: args[\"vault-name\"],\n order: args.order,\n limit: args.limit,\n });\n logger.out(secrets);\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(`Vault \"${args[\"vault-name\"]}\" not found.`, { cause: error });\n }\n throw error;\n }\n },\n});\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { z } from \"zod\";\nimport { confirmationArgs, workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { prompt } from \"@/cli/shared/prompt\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport { secretValueArgs } from \"./args\";\nimport { checkVaultManaged, releaseVaultOwnership } from \"./check-vault-managed\";\n\nexport const updateSecretCommand = defineAppCommand({\n name: \"update\",\n description: \"Update a secret in a vault.\",\n args: z\n .object({\n ...workspaceArgs,\n ...secretValueArgs,\n ...confirmationArgs,\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n const managed = await checkVaultManaged({\n client,\n workspaceId,\n vaultName: args[\"vault-name\"],\n });\n if (managed.isManaged && !args.yes) {\n const confirmed = await prompt.confirm({\n message: \"Do you want to proceed?\",\n default: false,\n });\n if (!confirmed) return;\n }\n try {\n await client.updateSecretManagerSecret({\n workspaceId,\n secretmanagerVaultName: args[\"vault-name\"],\n secretmanagerSecretName: args.name,\n secretmanagerSecretValue: args.value,\n });\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(`Secret \"${args.name}\" not found in vault \"${args[\"vault-name\"]}\".`, {\n cause: error,\n });\n }\n throw error;\n }\n\n if (managed.isManaged) {\n await releaseVaultOwnership({ client, ...managed });\n }\n\n logger.success(`Secret: ${args.name} updated in vault: ${args[\"vault-name\"]}`);\n },\n});\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\n\ntype ArgsShape = Record<string, z.ZodType>;\n\nexport const nameArgs = {\n name: arg(z.string(), {\n positional: true,\n description: \"Vault name\",\n }),\n} satisfies ArgsShape;\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { z } from \"zod\";\nimport { workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport { nameArgs } from \"./args\";\n\nexport const createCommand = defineAppCommand({\n name: \"create\",\n description: \"Create a new Secret Manager vault.\",\n args: z\n .object({\n ...workspaceArgs,\n ...nameArgs,\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n try {\n await client.createSecretManagerVault({\n workspaceId,\n secretmanagerVaultName: args.name,\n });\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.AlreadyExists) {\n throw new Error(`Vault \"${args.name}\" already exists.`, { cause: error });\n }\n throw error;\n }\n\n logger.success(`Vault: ${args.name} created`);\n },\n});\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { z } from \"zod\";\nimport { confirmationArgs, workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { prompt } from \"@/cli/shared/prompt\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport { checkVaultManaged } from \"../check-vault-managed\";\nimport { nameArgs } from \"./args\";\n\nexport const deleteCommand = defineAppCommand({\n name: \"delete\",\n description: \"Delete a Secret Manager vault.\",\n args: z\n .object({\n ...workspaceArgs,\n ...nameArgs,\n ...confirmationArgs,\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n // No additional confirmation for managed vaults — the name-typing confirmation below is a stronger guard.\n const managed = await checkVaultManaged({ client, workspaceId, vaultName: args.name });\n\n if (!args.yes) {\n const confirmation = await prompt.text({\n message: `Enter the vault name to confirm deletion (\"${args.name}\"):`,\n });\n if (confirmation !== args.name) {\n logger.info(\"Vault deletion cancelled.\");\n return;\n }\n }\n\n try {\n await client.deleteSecretManagerVault({\n workspaceId,\n secretmanagerVaultName: args.name,\n });\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(`Vault \"${args.name}\" not found.`, { cause: error });\n }\n throw error;\n }\n\n if (managed.isManaged) {\n logger.info(\n \"Remove this vault from defineSecretManager() in your config to prevent the next apply from re-creating it.\",\n );\n }\n\n logger.success(`Vault: ${args.name} deleted`);\n },\n});\n","import { timestampDate } from \"@bufbuild/protobuf/wkt\";\nimport { z } from \"zod\";\nimport { type Order, paginationArgs, toPageDirection, workspaceArgs } from \"@/cli/shared/args\";\nimport { fetchPaged, initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport type { SecretManagerVault } from \"@tailor-proto/tailor/v1/secret_manager_resource_pb\";\n\nexport interface VaultListOptions {\n workspaceId?: string;\n profile?: string;\n order?: Order;\n limit?: number;\n}\n\nexport interface VaultInfo {\n name: string;\n createdAt: Date | null;\n updatedAt: Date | null;\n}\n\nfunction vaultInfo(vault: SecretManagerVault): VaultInfo {\n return {\n name: vault.name,\n createdAt: vault.createTime ? timestampDate(vault.createTime) : null,\n updatedAt: vault.updateTime ? timestampDate(vault.updateTime) : null,\n };\n}\n\n/**\n * List Secret Manager vaults in the workspace.\n * @param options - Vault listing options\n * @returns List of vaults\n */\nasync function vaultList(options?: VaultListOptions): Promise<VaultInfo[]> {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options?.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: options?.workspaceId,\n profile: options?.profile,\n });\n\n const pageDirection = toPageDirection(options?.order);\n const vaults = await fetchPaged(\n async (pageToken, pageSize) => {\n const { vaults, nextPageToken } = await client.listSecretManagerVaults({\n workspaceId,\n pageToken,\n pageSize,\n pageDirection,\n });\n return [vaults, nextPageToken];\n },\n { limit: options?.limit },\n );\n\n return vaults.map(vaultInfo);\n}\n\nexport const listCommand = defineAppCommand({\n name: \"list\",\n description: \"List all Secret Manager vaults in the workspace.\",\n args: z\n .object({\n ...workspaceArgs,\n ...paginationArgs(),\n })\n .strict(),\n run: async (args) => {\n const vaults = await vaultList({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n order: args.order,\n limit: args.limit,\n });\n\n logger.out(vaults);\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { createCommand } from \"./create\";\nimport { deleteCommand } from \"./delete\";\nimport { listCommand } from \"./list\";\n\nexport const vaultCommand = defineCommand({\n name: \"vault\",\n description: \"Manage Secret Manager vaults.\",\n subCommands: {\n create: createCommand,\n delete: deleteCommand,\n list: listCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { createSecretCommand } from \"./create\";\nimport { deleteSecretCommand } from \"./delete\";\nimport { listSecretCommand } from \"./list\";\nimport { updateSecretCommand } from \"./update\";\nimport { vaultCommand } from \"./vault\";\n\nexport const secretCommand = defineCommand({\n name: \"secret\",\n description: \"Manage Secret Manager vaults and secrets.\",\n subCommands: {\n vault: vaultCommand,\n create: createSecretCommand,\n update: updateSecretCommand,\n list: listSecretCommand,\n delete: deleteSecretCommand,\n },\n async run() {\n await runCommand(vaultCommand, []);\n },\n});\n","export default \"name: Tailor Platform\\n\\non:\\n pull_request:\\n branches:\\n - main\\n push:\\n branches:\\n - main\\n workflow_dispatch:\\n\\nconcurrency:\\n group: tailor-__WORKSPACE_NAME__-${{ github.head_ref || github.ref }}\\n cancel-in-progress: ${{ github.event_name == 'pull_request' }}\\n\\njobs:\\n # __PLAN_JOB_START__\\n plan:\\n if: github.event_name == 'pull_request'\\n runs-on: ubuntu-latest\\n permissions:\\n contents: read\\n pull-requests: write\\n steps:\\n - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3\\n with:\\n fetch-depth: 0\\n # __SETUP_STEPS__\\n - uses: tailor-platform/actions/plan@e63ed98630a23fa21ee0636abf0f7fb75fcdce40 # v1.1.0\\n with:\\n workspace-id: ${{ vars.TAILOR_PLATFORM_WORKSPACE_ID }}\\n # __WORKING_DIRECTORY__\\n platform-client-id: ${{ secrets.PLATFORM_MACHINE_USER_CLIENT_ID }}\\n platform-client-secret: ${{ secrets.PLATFORM_MACHINE_USER_CLIENT_SECRET }}\\n github-token: ${{ secrets.GITHUB_TOKEN }}\\n # __PLAN_JOB_END__\\n deploy:\\n if: github.event_name != 'pull_request'\\n runs-on: ubuntu-latest\\n permissions:\\n contents: read\\n steps:\\n - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3\\n # __SETUP_STEPS__\\n - uses: tailor-platform/actions/deploy@e63ed98630a23fa21ee0636abf0f7fb75fcdce40 # v1.1.0\\n with:\\n workspace-name: __WORKSPACE_NAME__\\n workspace-region: __WORKSPACE_REGION__\\n organization-id: __ORGANIZATION_ID__\\n folder-id: __FOLDER_ID__\\n # __WORKING_DIRECTORY__\\n platform-client-id: ${{ secrets.PLATFORM_MACHINE_USER_CLIENT_ID }}\\n platform-client-secret: ${{ secrets.PLATFORM_MACHINE_USER_CLIENT_SECRET }}\\n\";","export default \"- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0\\n- run: bun install --frozen-lockfile\\n\";","export default \"- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0\\n with:\\n node-version-file: package.json\\n cache: npm\\n- run: npm ci\\n\";","export default \"- uses: pnpm/action-setup@0e279bb959325dab635dd2c09392533439d90093 # v6.0.8\\n- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0\\n with:\\n node-version-file: package.json\\n cache: pnpm\\n- run: pnpm install --frozen-lockfile\\n\";","export default \"- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0\\n with:\\n node-version-file: package.json\\n cache: yarn\\n- run: yarn install --frozen-lockfile\\n\";","import * as fs from \"node:fs\";\nimport * as path from \"pathe\";\nimport deployTemplate from \"./deploy.workflow.yml\";\nimport setupBun from \"./setup-bun.yml\";\nimport setupNpm from \"./setup-npm.yml\";\nimport setupPnpm from \"./setup-pnpm.yml\";\nimport setupYarn from \"./setup-yarn.yml\";\n\ntype PackageManager = \"pnpm\" | \"yarn\" | \"npm\" | \"bun\";\n\ntype DeployParams = {\n workspaceName: string;\n workspaceRegion: string;\n organizationId: string;\n folderId: string;\n workingDirectory?: string;\n packageManager: PackageManager;\n withPlan?: boolean;\n};\n\nconst setupSteps: Record<PackageManager, string> = {\n pnpm: setupPnpm,\n yarn: setupYarn,\n npm: setupNpm,\n bun: setupBun,\n};\n\nfunction indentSnippet(snippet: string, spaces: number): string {\n const indent = \" \".repeat(spaces);\n return snippet\n .trimEnd()\n .split(\"\\n\")\n .map((line) => (line ? indent + line : line))\n .join(\"\\n\");\n}\n\n/**\n * Detect the package manager used in a project directory by checking for lockfiles.\n * @param dir - Project directory to inspect\n * @returns Detected package manager, defaults to npm\n */\nexport function detectPackageManager(dir: string): PackageManager {\n if (fs.existsSync(path.join(dir, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (fs.existsSync(path.join(dir, \"yarn.lock\"))) return \"yarn\";\n if (fs.existsSync(path.join(dir, \"bun.lockb\")) || fs.existsSync(path.join(dir, \"bun.lock\")))\n return \"bun\";\n if (fs.existsSync(path.join(dir, \"package-lock.json\"))) return \"npm\";\n return \"npm\";\n}\n\n/**\n * Render the deploy workflow YAML.\n *\n * Generates a workflow that calls the composite deploy action\n * from tailor-platform/actions. The environment setup steps (Node.js,\n * package manager, dependency install) are generated based on the\n * detected package manager.\n *\n * If withPlan is true, also includes a plan job that runs on pull requests.\n * Otherwise, the plan job section delimited by __PLAN_JOB_START__ /\n * __PLAN_JOB_END__ markers is stripped from the template.\n * @param params - Workspace and deployment configuration\n * @returns Workflow YAML content\n */\nexport function renderDeploy(params: DeployParams): string {\n const {\n workspaceName,\n workspaceRegion,\n organizationId,\n folderId,\n workingDirectory,\n packageManager,\n withPlan,\n } = params;\n\n const workingDirectoryLine = workingDirectory\n ? ` working-directory: ${workingDirectory}\\n`\n : \"\";\n\n const stripPlanSection = (content: string): string =>\n withPlan\n ? content.replace(/^ *# __PLAN_JOB_(?:START|END)__\\n/gm, \"\")\n : content.replace(/^ *# __PLAN_JOB_START__\\n[\\s\\S]*?^ *# __PLAN_JOB_END__\\n/m, \"\");\n\n return stripPlanSection(deployTemplate)\n .replaceAll(\"__WORKSPACE_NAME__\", () => workspaceName)\n .replaceAll(\"__WORKSPACE_REGION__\", () => workspaceRegion)\n .replaceAll(\"__ORGANIZATION_ID__\", () => organizationId)\n .replaceAll(\"__FOLDER_ID__\", () => folderId)\n .replace(/ *# __WORKING_DIRECTORY__\\n/g, () => workingDirectoryLine)\n .replace(/^ *# __SETUP_STEPS__$/gm, () => indentSnippet(setupSteps[packageManager], 6));\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"pathe\";\nimport { logBetaWarning } from \"@/cli/shared/beta\";\nimport { logger, styles } from \"@/cli/shared/logger\";\nimport { detectPackageManager, renderDeploy } from \"./templates\";\n\nexport type SetupGitHubOptions = {\n workspaceName: string;\n workspaceRegion: string;\n organizationId: string;\n folderId: string;\n dir: string;\n outputDir: string;\n withPlan?: boolean;\n};\n\ntype GeneratedFile = {\n path: string;\n content: string;\n};\n\ntype WriteResult = {\n written: string[];\n skipped: string[];\n};\n\n/**\n * Build the list of GitHub Actions files to generate.\n * @param options - Setup options including workspace config and output directory\n * @returns Array of files with paths and rendered content\n */\nexport function buildFiles(options: SetupGitHubOptions): GeneratedFile[] {\n const githubDir = path.join(options.outputDir, \".github\");\n const packageManager = detectPackageManager(options.outputDir);\n const workingDirectory = options.dir !== \".\" ? options.dir : undefined;\n\n return [\n {\n path: path.join(githubDir, `workflows/tailor-${options.workspaceName}.yml`),\n content: renderDeploy({\n workspaceName: options.workspaceName,\n workspaceRegion: options.workspaceRegion,\n organizationId: options.organizationId,\n folderId: options.folderId,\n workingDirectory,\n packageManager,\n withPlan: options.withPlan,\n }),\n },\n ];\n}\n\n/**\n * Write files to disk, skipping any that already exist.\n * @param files - Files to write\n * @returns Result with lists of written and skipped file paths\n */\nexport function writeFiles(files: GeneratedFile[]): WriteResult {\n const written: string[] = [];\n const skipped: string[] = [];\n\n for (const file of files) {\n if (fs.existsSync(file.path)) {\n skipped.push(file.path);\n continue;\n }\n fs.mkdirSync(path.dirname(file.path), { recursive: true });\n fs.writeFileSync(file.path, file.content);\n written.push(file.path);\n }\n\n return { written, skipped };\n}\n\n/**\n * Generate GitHub Actions workflow files and print next steps.\n * @param options - Setup options including workspace config and output directory\n */\nexport function setupGitHub(options: SetupGitHubOptions): void {\n logBetaWarning(\"setup github\");\n\n const files = buildFiles(options);\n const result = writeFiles(files);\n\n for (const filePath of result.written) {\n const relativePath = path.relative(options.outputDir, filePath);\n logger.success(`Generated ${styles.path(relativePath)}`);\n }\n\n for (const filePath of result.skipped) {\n const relativePath = path.relative(options.outputDir, filePath);\n logger.warn(`Skipped ${styles.path(relativePath)} (already exists)`);\n }\n\n logger.newline();\n logger.info(\"Next steps - set GitHub secrets:\");\n logger.log(` gh secret set PLATFORM_MACHINE_USER_CLIENT_ID`);\n logger.log(` gh secret set PLATFORM_MACHINE_USER_CLIENT_SECRET`);\n\n if (options.withPlan) {\n logger.newline();\n logger.info(\"For plan job - set GitHub variable with your workspace ID:\");\n logger.log(` gh variable set TAILOR_PLATFORM_WORKSPACE_ID`);\n }\n}\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { setupGitHub } from \"./github\";\n\nexport const githubCommand = defineAppCommand({\n name: \"github\",\n description: \"Generate GitHub Actions workflow for deployment. (beta)\",\n args: z\n .object({\n \"workspace-name\": arg(z.string(), {\n alias: \"n\",\n description: \"Workspace name\",\n }),\n \"workspace-region\": arg(z.string(), {\n alias: \"r\",\n description: \"Workspace region\",\n }),\n // Required here because the generated workflow uses these for workspace creation.\n // Could be made optional in the future if we add conditional template rendering.\n \"organization-id\": arg(z.string(), {\n alias: \"o\",\n description: \"Organization ID\",\n }),\n \"folder-id\": arg(z.string(), {\n alias: \"f\",\n description: \"Folder ID\",\n }),\n dir: arg(z.string().default(\".\"), {\n alias: \"d\",\n description: \"App directory (for monorepo setups)\",\n }),\n \"with-plan\": arg(z.boolean().default(false), {\n alias: \"p\",\n description: \"Include plan job for PR previews\",\n }),\n })\n .strict(),\n run: (args) => {\n setupGitHub({\n workspaceName: args[\"workspace-name\"],\n workspaceRegion: args[\"workspace-region\"],\n organizationId: args[\"organization-id\"],\n folderId: args[\"folder-id\"],\n dir: args.dir,\n outputDir: process.cwd(),\n withPlan: args[\"with-plan\"],\n });\n },\n});\n","import { defineCommand } from \"politty\";\nimport { githubCommand } from \"./github\";\n\nexport const setupCommand = defineCommand({\n name: \"setup\",\n description: \"Set up project infrastructure.\",\n subCommands: {\n github: githubCommand,\n },\n});\n","import { spawn } from \"node:child_process\";\n\nexport const SKILL_NAME = \"tailor-sdk\";\nconst SKILLS_SOURCE_ENV_KEY = \"TAILOR_SDK_SKILLS_SOURCE\";\n\ninterface ChildProcessLike {\n on(event: \"close\", listener: (code: number | null) => void): ChildProcessLike;\n on(event: \"error\", listener: (error: Error) => void): ChildProcessLike;\n}\n\ntype SpawnLike = (\n command: string,\n args: string[],\n options: { stdio: \"inherit\" },\n) => ChildProcessLike;\n\nexport interface RunSkillsInstallerOptions {\n source: string;\n agent?: string;\n yes?: boolean;\n spawnFn?: SpawnLike;\n}\n\nfunction resolveNpxCommand(platform: NodeJS.Platform = process.platform): string {\n return platform === \"win32\" ? \"npx.cmd\" : \"npx\";\n}\n\nfunction resolveSkillsSource(source: string): string {\n return process.env[SKILLS_SOURCE_ENV_KEY] ?? source;\n}\n\n/**\n * Build CLI arguments for `skills add` with the fixed tailor-sdk skill target.\n * `--copy` is included so the installed skill survives `pnpm install` wiping `node_modules`.\n * @param options - Options controlling the generated `skills add` arguments\n * @param options.source\n * @param options.agent\n * @param options.yes\n * @returns CLI arguments for `npx skills add`\n */\nexport function buildSkillsAddArgs(options: {\n source: string;\n agent?: string;\n yes?: boolean;\n}): string[] {\n const args = [\n \"skills\",\n \"add\",\n resolveSkillsSource(options.source),\n \"--skill\",\n SKILL_NAME,\n \"--copy\",\n ];\n if (options.agent) args.push(\"--agent\", options.agent);\n if (options.yes) args.push(\"--yes\");\n return args;\n}\n\n/**\n * Run `npx skills add` to install the tailor-sdk skill.\n * @param options - Runtime options for skill installation\n * @returns Process exit code from the spawned `npx` command\n */\nexport async function runSkillsInstaller(options: RunSkillsInstallerOptions): Promise<number> {\n const args = buildSkillsAddArgs({\n source: options.source,\n agent: options.agent,\n yes: options.yes,\n });\n const spawnFn =\n options.spawnFn ??\n ((command: string, spawnArgs: string[], spawnOptions: { stdio: \"inherit\" }) =>\n spawn(command, spawnArgs, spawnOptions));\n\n const childProcess = spawnFn(resolveNpxCommand(), args, { stdio: \"inherit\" });\n\n return await new Promise<number>((resolve, reject) => {\n childProcess.on(\"error\", (error) => reject(error));\n childProcess.on(\"close\", (code) => resolve(code ?? 1));\n });\n}\n","import { dirname, resolve } from \"pathe\";\nimport { resolvePackageJSON } from \"pkg-types\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { runSkillsInstaller } from \"@/cli/shared/skills-installer\";\n\n// Resolve the SDK package root at runtime so the skills directory is found\n// regardless of how the file is bundled (tsdown inlines non-entry modules).\n// The directory is named `agent-skills` (not `skills`) to avoid `gh skill`'s\n// `**/skills/*/SKILL.md` recursive match that would otherwise pick up both\n// this bundled copy and the repo-root `skills/` and report a conflict.\nexport async function resolveBundledSkillsDir(): Promise<string> {\n const pkgJsonPath = await resolvePackageJSON(import.meta.url);\n return resolve(dirname(pkgJsonPath), \"agent-skills\");\n}\n\nconst DEFAULT_AGENT = \"claude-code\";\n\nexport const installCommand = defineAppCommand({\n name: \"install\",\n description: \"Install the tailor-sdk agent skill from the installed SDK package.\",\n args: z\n .object({\n agent: arg(z.string().default(DEFAULT_AGENT), {\n alias: \"a\",\n description: `vercel/skills agent name (e.g. ${DEFAULT_AGENT}, codex). Defaults to ${DEFAULT_AGENT}.`,\n }),\n yes: arg(z.boolean().default(false), {\n alias: \"y\",\n description: \"Auto-approve prompts.\",\n }),\n })\n .strict(),\n run: async (args) => {\n const exitCode = await runSkillsInstaller({\n source: await resolveBundledSkillsDir(),\n agent: args.agent,\n yes: args.yes,\n });\n if (exitCode !== 0) {\n process.exit(exitCode);\n }\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { installCommand } from \"./install\";\n\nexport const skillsCommand = defineCommand({\n name: \"skills\",\n description: \"Manage Tailor SDK agent skills.\",\n subCommands: {\n install: installCommand,\n },\n async run() {\n await runCommand(installCommand, []);\n },\n});\n","import { setTimeout } from \"node:timers/promises\";\n\n/**\n * Create a simple progress reporter that writes updates to stderr.\n * @param label - Label to prefix progress output\n * @param total - Total number of steps\n * @returns Progress helpers\n */\nexport function createProgress(label: string, total: number) {\n let current = 0;\n\n const update = () => {\n current += 1;\n const percent = Math.round((current / total) * 100);\n process.stderr.write(`\\r${label} ${current}/${total} (${percent}%)`);\n };\n\n const finish = () => {\n process.stderr.write(\"\\n\");\n };\n\n return { update, finish };\n}\n\n/**\n * Wrap a promise with a timeout, rejecting if the timeout elapses first.\n * @template T\n * @param p - Promise to await\n * @param ms - Timeout in milliseconds\n * @param message - Error message on timeout\n * @returns Result of the original promise if it completes in time\n */\nexport async function withTimeout<T>(p: Promise<T>, ms: number, message: string): Promise<T> {\n return await Promise.race([\n p,\n setTimeout(ms).then(() => {\n throw new Error(message);\n }),\n ]);\n}\n","import * as fs from \"fs\";\nimport { Code, ConnectError } from \"@connectrpc/connect\";\nimport { lookup as mimeLookup } from \"mime-types\";\nimport pLimit from \"p-limit\";\nimport * as path from \"pathe\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient, type OperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { createProgress, withTimeout } from \"@/cli/shared/progress\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport type { MessageInitShape } from \"@bufbuild/protobuf\";\nimport type { UploadFileRequestSchema } from \"@tailor-proto/tailor/v1/staticwebsite_pb\";\n\nconst CHUNK_SIZE = 64 * 1024; // 64KB\nconst IGNORED_FILES = new Set([\".DS_Store\", \"thumbs.db\", \"desktop.ini\"]);\nfunction shouldIgnoreFile(filePath: string) {\n const fileName = path.basename(filePath).toLowerCase();\n return IGNORED_FILES.has(fileName);\n}\n\nexport type DeployResult = {\n url: string;\n skippedFiles: string[];\n};\n\n/**\n * Deploy a static website by creating a deployment, uploading files, and publishing it.\n * @param client - Operator client instance\n * @param workspaceId - Workspace ID\n * @param name - Static website name\n * @param distDir - Directory containing static site files\n * @param showProgress - Whether to show upload progress\n * @returns Deployment result with URL and skipped files\n */\nexport async function deployStaticWebsite(\n client: OperatorClient,\n workspaceId: string,\n name: string,\n distDir: string,\n showProgress: boolean = true,\n): Promise<DeployResult> {\n const { deploymentId } = await client.createDeployment({\n workspaceId,\n name,\n });\n\n if (!deploymentId) {\n throw new Error(\"createDeployment returned empty deploymentId\");\n }\n\n const skippedFiles = await uploadDirectory(\n client,\n workspaceId,\n deploymentId,\n distDir,\n showProgress,\n );\n\n const { url } = await client.publishDeployment({\n workspaceId,\n deploymentId,\n });\n\n if (!url) {\n throw new Error(\"publishDeployment returned empty url\");\n }\n\n return { url, skippedFiles };\n}\n\nasync function uploadDirectory(\n client: OperatorClient,\n workspaceId: string,\n deploymentId: string,\n rootDir: string,\n showProgress: boolean,\n): Promise<string[]> {\n const files = await collectFiles(rootDir);\n if (files.length === 0) {\n logger.warn(`No files found under ${rootDir}`);\n return [];\n }\n\n const concurrency = 5;\n const limit = pLimit(concurrency);\n\n const total = files.length;\n const progress = showProgress ? createProgress(\"Uploading files\", total) : undefined;\n const skippedFiles: string[] = [];\n\n await Promise.all(\n files.map((relativePath) =>\n limit(async () => {\n await uploadSingleFile(\n client,\n workspaceId,\n deploymentId,\n rootDir,\n relativePath,\n skippedFiles,\n );\n if (progress) {\n progress.update();\n }\n }),\n ),\n );\n\n if (progress) {\n progress.finish();\n }\n\n return skippedFiles;\n}\n\n/**\n * Recursively collect all deployable files under the given directory.\n * @param rootDir - Root directory to scan\n * @param currentDir - Current relative directory (for recursion)\n * @returns List of file paths relative to rootDir\n */\nasync function collectFiles(rootDir: string, currentDir = \"\"): Promise<string[]> {\n const dirPath = path.join(rootDir, currentDir);\n\n const entries = await fs.promises.readdir(dirPath, {\n withFileTypes: true,\n });\n const files: string[] = [];\n\n for (const entry of entries) {\n const rel = path.join(currentDir, entry.name);\n if (entry.isDirectory()) {\n const sub = await collectFiles(rootDir, rel);\n files.push(...sub);\n } else if (entry.isFile() && !entry.isSymbolicLink() && !shouldIgnoreFile(rel)) {\n files.push(rel);\n }\n }\n\n return files;\n}\n\nasync function uploadSingleFile(\n client: OperatorClient,\n workspaceId: string,\n deploymentId: string,\n rootDir: string,\n filePath: string,\n skippedFiles: string[],\n): Promise<void> {\n const absPath = path.join(rootDir, filePath);\n\n const mime = mimeLookup(filePath);\n\n if (!mime) {\n skippedFiles.push(`${filePath} (unsupported content type; no MIME mapping found)`);\n return;\n }\n\n const contentType = mime;\n\n const readStream = fs.createReadStream(absPath, {\n highWaterMark: CHUNK_SIZE,\n });\n\n async function* requestStream(): AsyncIterable<MessageInitShape<typeof UploadFileRequestSchema>> {\n yield {\n payload: {\n case: \"initialMetadata\",\n value: {\n workspaceId,\n deploymentId,\n filePath,\n contentType,\n },\n },\n };\n for await (const chunk of readStream) {\n yield {\n payload: {\n case: \"chunkData\",\n value: chunk as Buffer,\n },\n };\n }\n }\n\n async function uploadWithLogging() {\n try {\n await client.uploadFile(requestStream());\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.InvalidArgument) {\n skippedFiles.push(`${filePath} (server rejected file as invalid: ${error.message})`);\n return;\n }\n // For non-validation errors, fail the deployment as before.\n throw error;\n }\n }\n\n await withTimeout(\n uploadWithLogging(),\n // 2 minutes per file\n 2 * 60_000,\n `Upload timed out for \"${filePath}\"`,\n );\n}\n\n/**\n * Log skipped files after a deployment, including reasons for skipping.\n * @param skippedFiles - List of skipped file descriptions\n */\nexport function logSkippedFiles(skippedFiles: string[]) {\n if (skippedFiles.length === 0) {\n return;\n }\n logger.warn(\n \"Deployment completed, but some files failed to upload. These files may have unsupported content types or other validation issues. Please review the list below:\",\n );\n for (const file of skippedFiles) {\n logger.log(` - ${file}`);\n }\n}\n\nexport const deployCommand = defineAppCommand({\n name: \"deploy\",\n description: \"Deploy a static website from a local build directory.\",\n args: z\n .object({\n ...workspaceArgs,\n name: arg(z.string(), {\n alias: \"n\",\n description: \"Static website name\",\n }),\n dir: arg(z.string(), {\n alias: \"d\",\n description: \"Path to the static website files\",\n completion: { type: \"directory\" },\n }),\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n logger.info(`Deploying static website \"${args.name}\" from directory: ${args.dir}`);\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n\n const name = args.name;\n const dir = path.resolve(process.cwd(), args.dir);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) {\n throw new Error(`Directory not found or not a directory: ${dir}`);\n }\n\n const { url, skippedFiles } = await withTimeout(\n deployStaticWebsite(client, workspaceId, name, dir, !args.json),\n // 10 minutes\n 10 * 60_000,\n \"Deployment timed out after 10 minutes.\",\n );\n\n if (args.json) {\n logger.out({ name, workspaceId, url, skippedFiles });\n } else {\n logger.success(`Static website \"${name}\" deployed successfully. URL: ${url}`);\n logSkippedFiles(skippedFiles);\n }\n },\n});\n","import { CustomDomainStatus } from \"@tailor-proto/tailor/v1/staticwebsite_resource_pb\";\n\nexport const statusLabels: Record<CustomDomainStatus, string> = {\n [CustomDomainStatus.UNSPECIFIED]: \"unspecified\",\n [CustomDomainStatus.PENDING]: \"pending\",\n [CustomDomainStatus.VERIFYING]: \"verifying\",\n [CustomDomainStatus.CERT_ISSUED]: \"cert_issued\",\n [CustomDomainStatus.ACTIVE]: \"active\",\n [CustomDomainStatus.FAILED]: \"failed\",\n};\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { statusLabels } from \"./status\";\n\nexport const domainGetCommand = defineAppCommand({\n name: \"get\",\n description: \"Get details of a custom domain.\",\n args: z\n .object({\n ...workspaceArgs,\n domain: arg(z.string(), {\n positional: true,\n description: \"Custom domain name\",\n }),\n })\n .strict(),\n run: async (args) => {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n const notFoundErrorMessage = `Custom domain \"${args.domain}\" not found.`;\n\n try {\n const { customDomain } = await client.getCustomDomain({\n workspaceId,\n domain: args.domain,\n });\n\n if (!customDomain) {\n throw new Error(notFoundErrorMessage);\n }\n\n const info = {\n domain: customDomain.domain,\n status: statusLabels[customDomain.status] ?? \"unknown\",\n trafficCnameTarget: customDomain.trafficCnameTarget,\n certificateCnameTarget: customDomain.certificateCnameTarget,\n errorMessage: customDomain.errorMessage || undefined,\n };\n\n logger.out(info);\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(notFoundErrorMessage, { cause: error });\n }\n throw error;\n }\n },\n});\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { statusLabels } from \"./status\";\n\nexport const domainListCommand = defineAppCommand({\n name: \"list\",\n description: \"List custom domains for a static website.\",\n args: z\n .object({\n ...workspaceArgs,\n name: arg(z.string(), {\n positional: true,\n description: \"Static website name\",\n }),\n })\n .strict(),\n run: async (args) => {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n try {\n const { customDomains } = await client.listCustomDomains({\n workspaceId,\n staticWebsiteName: args.name,\n });\n\n if (customDomains.length === 0) {\n logger.info(\"No custom domains found.\");\n return;\n }\n\n const formatted = customDomains.map((d) => ({\n domain: d.domain,\n status: statusLabels[d.status] ?? \"unknown\",\n trafficCnameTarget: d.trafficCnameTarget,\n certificateCnameTarget: d.certificateCnameTarget,\n }));\n\n logger.out(formatted);\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(`Static website \"${args.name}\" not found.`, { cause: error });\n }\n throw error;\n }\n },\n});\n","import { defineCommand } from \"politty\";\nimport { domainGetCommand } from \"./get\";\nimport { domainListCommand } from \"./list\";\n\nexport const domainCommand = defineCommand({\n name: \"domain\",\n description: \"Manage custom domains for static websites.\",\n subCommands: {\n list: domainListCommand,\n get: domainGetCommand,\n },\n});\n","import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { workspaceArgs } from \"@/cli/shared/args\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\n\nexport const getCommand = defineAppCommand({\n name: \"get\",\n description: \"Get details of a specific static website.\",\n args: z\n .object({\n ...workspaceArgs,\n name: arg(z.string(), {\n positional: true,\n description: \"Static website name\",\n }),\n })\n .strict(),\n run: async (args) => {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n\n const notFoundErrorMessage = `Static website \"${args.name}\" not found.`;\n\n try {\n const { staticwebsite } = await client.getStaticWebsite({\n workspaceId,\n name: args.name,\n });\n\n if (!staticwebsite) {\n throw new Error(notFoundErrorMessage);\n }\n\n const info = {\n workspaceId,\n name: staticwebsite.name,\n description: staticwebsite.description,\n url: staticwebsite.url,\n allowedIpAddresses: args.json\n ? staticwebsite.allowedIpAddresses\n : staticwebsite.allowedIpAddresses.join(\"\\n\"),\n };\n\n logger.out(info);\n } catch (error) {\n if (error instanceof ConnectError && error.code === Code.NotFound) {\n throw new Error(notFoundErrorMessage, { cause: error });\n }\n throw error;\n }\n },\n});\n","import { z } from \"zod\";\nimport { type Order, paginationArgs, toPageDirection, workspaceArgs } from \"@/cli/shared/args\";\nimport { fetchPaged, initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\n\nexport interface StaticWebsiteInfo {\n workspaceId: string;\n name: string;\n description: string;\n url: string;\n allowedIpAddresses: string[];\n}\n\ntype StaticWebsiteListOptions = {\n workspaceId?: string;\n profile?: string;\n order?: Order;\n limit?: number;\n};\n\n/**\n * List static websites in the workspace.\n * @param options - Static website listing options\n * @returns List of static websites\n */\nasync function listStaticWebsites(\n options?: StaticWebsiteListOptions,\n): Promise<StaticWebsiteInfo[]> {\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: options?.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: options?.workspaceId,\n profile: options?.profile,\n });\n\n const pageDirection = toPageDirection(options?.order);\n const websites = await fetchPaged(\n async (pageToken, pageSize) => {\n const { staticwebsites, nextPageToken } = await client.listStaticWebsites({\n workspaceId,\n pageToken,\n pageSize,\n pageDirection,\n });\n return [staticwebsites, nextPageToken];\n },\n { limit: options?.limit },\n );\n\n return websites.map((site) => ({\n workspaceId,\n name: site.name,\n description: site.description,\n url: site.url ?? \"\",\n allowedIpAddresses: site.allowedIpAddresses,\n }));\n}\n\nexport const listCommand = defineAppCommand({\n name: \"list\",\n description: \"List all static websites in a workspace.\",\n args: z\n .object({\n ...workspaceArgs,\n ...paginationArgs(),\n })\n .strict(),\n run: async (args) => {\n const jsonOutput = logger.jsonMode;\n const websites = await listStaticWebsites({\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n order: args.order,\n limit: args.limit,\n });\n\n const formatted = jsonOutput\n ? websites\n : websites.map(({ allowedIpAddresses, ...rest }) => {\n if (allowedIpAddresses.length === 0) {\n return {\n ...rest,\n allowedIpAddresses: \"No allowed IP addresses\",\n };\n }\n\n const count = allowedIpAddresses.length;\n const label = count === 1 ? \"1 IP address\" : `${count} IP addresses`;\n\n return {\n ...rest,\n allowedIpAddresses: label,\n };\n });\n\n logger.out(formatted);\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { deployCommand } from \"./deploy\";\nimport { domainCommand } from \"./domain\";\nimport { getCommand } from \"./get\";\nimport { listCommand } from \"./list\";\n\nexport const staticwebsiteCommand = defineCommand({\n name: \"staticwebsite\",\n description: \"Manage static websites in your workspace.\",\n subCommands: {\n deploy: deployCommand,\n domain: domainCommand,\n list: listCommand,\n get: getCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { defineApplication } from \"@/cli/services/application\";\nimport { loadConfig } from \"@/cli/shared/config-loader\";\nimport { generateUserTypes } from \"@/cli/shared/type-generator\";\nimport { PluginManager } from \"@/plugin/manager\";\nimport type { LoadedConfig } from \"@/cli/shared/config-loader\";\nimport type { TailorDBNamespaceData } from \"@/types/plugin-generation\";\n\nexport interface LoadLocalErdSchemaOptions {\n configPath?: string;\n namespaces?: string[];\n requireErdSite?: boolean;\n}\n\nexport interface LocalErdSchemaContext {\n config: LoadedConfig;\n namespaces: TailorDBNamespaceData[];\n}\n\nexport interface ResolveLocalErdSchemaNamespacesOptions {\n /** Explicit namespace selection. */\n namespaces?: string[];\n /** Limit implicit selection to owned namespaces with erdSite configured. */\n requireErdSite?: boolean;\n}\n\n/**\n * Resolve TailorDB namespaces that need local type loading for ERD generation.\n * @param config - Loaded Tailor config.\n * @param options - Namespace selection options.\n * @returns Namespace names to load, or undefined to load all owned namespaces.\n */\nexport function resolveLocalErdSchemaNamespaces(\n config: LoadedConfig,\n options: ResolveLocalErdSchemaNamespacesOptions,\n): string[] | undefined {\n if (options.namespaces) {\n return options.namespaces;\n }\n if (!options.requireErdSite) {\n return undefined;\n }\n\n return Object.entries(config.db ?? {}).flatMap(([namespace, dbConfig]) =>\n \"external\" in dbConfig || !dbConfig.erdSite ? [] : [namespace],\n );\n}\n\n/**\n * Load local TailorDB namespaces exactly as SDK generation/deploy sees them.\n * @param options - Local schema loading options.\n * @returns Loaded TailorDB namespace data.\n */\nexport async function loadLocalErdSchema(\n options: LoadLocalErdSchemaOptions,\n): Promise<LocalErdSchemaContext> {\n const { config, plugins } = await loadConfig(options.configPath);\n\n await generateUserTypes({ config, configPath: config.path });\n\n const pluginManager = plugins.length > 0 ? new PluginManager(plugins) : undefined;\n const application = defineApplication({\n config,\n pluginManager,\n });\n const namespaceNames = resolveLocalErdSchemaNamespaces(config, {\n namespaces: options.namespaces,\n requireErdSite: options.requireErdSite,\n });\n const namespaceFilter = namespaceNames ? new Set(namespaceNames) : undefined;\n const services = namespaceFilter\n ? application.tailorDBServices.filter((db) => namespaceFilter.has(db.namespace))\n : application.tailorDBServices;\n\n if (namespaceFilter && services.length !== namespaceFilter.size) {\n const available = application.tailorDBServices.map((db) => db.namespace).join(\", \");\n const requested = [...namespaceFilter].join(\", \");\n throw new Error(\n `TailorDB namespace \"${requested}\" not found in local config.db.` +\n (available ? ` Available owned namespaces: ${available}` : \"\"),\n );\n }\n\n const namespaces: TailorDBNamespaceData[] = [];\n\n for (const db of services) {\n await db.loadTypes();\n await db.processNamespacePlugins();\n namespaces.push({\n namespace: db.namespace,\n types: { ...db.types },\n sourceInfo: new Map(Object.entries(db.typeSourceInfo)),\n pluginAttachments: db.pluginAttachments,\n });\n }\n\n return { config, namespaces };\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"pathe\";\nimport { hashContent } from \"@/cli/cache/hasher\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { isPluginGeneratedType } from \"@/types/tailordb\";\nimport type {\n TailorDbErdColumn,\n TailorDbErdColumnRelation,\n TailorDbErdIndex,\n TailorDbErdRelation,\n TailorDbErdRelationship,\n TailorDbErdSchema,\n TailorDbErdSource,\n TailorDbErdTable,\n TailorDbErdTypeSource,\n} from \"./types\";\nimport type { TailorDBNamespaceData } from \"@/types/plugin-generation\";\nimport type {\n OperatorFieldConfig,\n ParsedField,\n TailorDBType,\n TypeSourceInfoEntry,\n} from \"@/types/tailordb\";\n\nconst CLEAN_ROOM_NOTES = [\n \"Generated by a TailorDB-specific viewer implementation.\",\n \"The implementation is based on TailorDB schema contracts, public Liam documentation, Liam CLI help, and black-box generated-output observation.\",\n \"It does not copy Liam source code, generated JavaScript/CSS, parser internals, or layout internals.\",\n];\n\ninterface BuildTailorDbErdSchemaOptions {\n namespaceData: TailorDBNamespaceData;\n generatedAt?: string;\n source?: TailorDbErdSource;\n}\n\ninterface WriteTailorDbErdSchemaOptions {\n schema: TailorDbErdSchema;\n outputPath: string;\n}\n\ninterface BuildColumnOptions {\n fieldName: string;\n fieldConfig: OperatorFieldConfig;\n parsedField?: ParsedField;\n indexEntries: Array<[string, TailorDbErdIndex]>;\n}\n\nfunction buildRevision(schema: Omit<TailorDbErdSchema, \"generatedAt\" | \"revision\">): string {\n return hashContent(JSON.stringify(schema)).slice(0, 16);\n}\n\nfunction toTypeSource(source: TypeSourceInfoEntry | undefined): TailorDbErdTypeSource | undefined {\n if (!source) return undefined;\n if (isPluginGeneratedType(source)) {\n return {\n kind: \"plugin\",\n exportName: source.exportName,\n pluginId: source.pluginId,\n pluginImportPath: source.pluginImportPath,\n originalExportName: source.originalExportName,\n generatedTypeKind: source.generatedTypeKind,\n namespace: source.namespace,\n };\n }\n return {\n kind: \"user\",\n exportName: source.exportName,\n };\n}\n\nfunction toRelationships(\n relationships: Record<string, TailorDBType[\"forwardRelationships\"][string]>,\n): TailorDbErdRelationship[] {\n return Object.entries(relationships)\n .toSorted(([a], [b]) => a.localeCompare(b))\n .map(([name, relationship]) => ({\n name,\n targetType: relationship.targetType,\n targetField: relationship.targetField,\n sourceField: relationship.sourceField,\n isArray: relationship.isArray,\n ...(relationship.description && { description: relationship.description }),\n }));\n}\n\nfunction toIndexes(type: TailorDBType): TailorDbErdIndex[] {\n return Object.entries(type.indexes ?? {})\n .toSorted(([a], [b]) => a.localeCompare(b))\n .map(([name, index]) => ({\n name,\n fields: [...index.fields],\n unique: index.unique === true,\n }));\n}\n\nfunction toColumnRelation(options: BuildColumnOptions): TailorDbErdColumnRelation | undefined {\n const { fieldConfig, parsedField } = options;\n if (!fieldConfig.foreignKey || !fieldConfig.foreignKeyType) {\n return undefined;\n }\n\n const required = fieldConfig.required !== false;\n const kind = parsedField?.relation || fieldConfig.rawRelation ? \"relation\" : \"foreignKey\";\n return {\n targetTable: fieldConfig.foreignKeyType,\n targetColumn: fieldConfig.foreignKeyField || \"id\",\n kind,\n required,\n ...(fieldConfig.rawRelation?.type && { relationType: fieldConfig.rawRelation.type }),\n ...(parsedField?.relation?.forwardName && { forwardName: parsedField.relation.forwardName }),\n ...(parsedField?.relation?.backwardName && {\n backwardName: parsedField.relation.backwardName,\n }),\n };\n}\n\nfunction toColumn(options: BuildColumnOptions): TailorDbErdColumn {\n const { fieldName, fieldConfig } = options;\n const indexNames = options.indexEntries\n .filter(([, index]) => index.fields.includes(fieldName))\n .map(([name]) => name);\n const uniqueIndexNames = options.indexEntries\n .filter(([, index]) => index.unique && index.fields.includes(fieldName))\n .map(([name]) => name);\n\n const enumValues = fieldConfig.allowedValues?.map((value) => value.value) ?? [];\n const enumValueDescriptions = Object.fromEntries(\n (fieldConfig.allowedValues ?? []).flatMap((value) =>\n value.description ? [[value.value, value.description]] : [],\n ),\n );\n const nestedFields = Object.entries(fieldConfig.fields ?? {}).map(([nestedName, nestedConfig]) =>\n toColumn({\n fieldName: nestedName,\n fieldConfig: nestedConfig,\n indexEntries: [],\n }),\n );\n const relation = toColumnRelation(options);\n\n return {\n name: fieldName,\n type: fieldConfig.type || \"string\",\n required: fieldConfig.required !== false,\n array: fieldConfig.array === true,\n ...(fieldConfig.description && { description: fieldConfig.description }),\n ...(fieldConfig.unique && { unique: true }),\n ...((fieldConfig.index || indexNames.length > 0) && { index: true }),\n ...(indexNames.length > 0 && { indexNames }),\n ...(uniqueIndexNames.length > 0 && { uniqueIndexNames }),\n ...(enumValues.length > 0 && { enumValues }),\n ...(Object.keys(enumValueDescriptions).length > 0 && { enumValueDescriptions }),\n ...(fieldConfig.vector && { vector: true }),\n ...(fieldConfig.serial && { serial: { ...fieldConfig.serial } }),\n ...(fieldConfig.scale !== undefined && { scale: fieldConfig.scale }),\n ...(fieldConfig.validate?.length && { validations: fieldConfig.validate.length }),\n ...(fieldConfig.hooks && {\n hooks: {\n ...(fieldConfig.hooks.create && { create: true }),\n ...(fieldConfig.hooks.update && { update: true }),\n },\n }),\n ...(nestedFields.length > 0 && { fields: nestedFields }),\n ...(relation && { relation }),\n };\n}\n\nfunction toTable(type: TailorDBType, source: TypeSourceInfoEntry | undefined): TailorDbErdTable {\n const indexes = toIndexes(type);\n const indexEntries: Array<[string, TailorDbErdIndex]> = indexes.map((index) => [\n index.name,\n index,\n ]);\n const fieldColumns = Object.entries(type.fields)\n .filter(([fieldName]) => fieldName !== \"id\")\n .map(([fieldName, field]) =>\n toColumn({\n fieldName,\n fieldConfig: field.config,\n parsedField: field,\n indexEntries,\n }),\n );\n\n const typeSource = toTypeSource(source);\n\n return {\n name: type.name,\n pluralForm: type.pluralForm,\n ...(type.description && { description: type.description }),\n ...(typeSource && { source: typeSource }),\n columns: [\n {\n name: \"id\",\n type: \"uuid\",\n required: true,\n array: false,\n primaryKey: true,\n unique: true,\n },\n ...fieldColumns,\n ],\n indexes,\n forwardRelationships: toRelationships(type.forwardRelationships),\n backwardRelationships: toRelationships(type.backwardRelationships),\n };\n}\n\nfunction toRelation(sourceTable: string, field: ParsedField): TailorDbErdRelation | undefined {\n const relation = toColumnRelation({\n fieldName: field.name,\n fieldConfig: field.config,\n parsedField: field,\n indexEntries: [],\n });\n if (!relation) return undefined;\n\n return {\n name: `${sourceTable}.${field.name}->${relation.targetTable}.${relation.targetColumn}`,\n sourceTable,\n sourceColumns: [field.name],\n targetTable: relation.targetTable,\n targetColumns: [relation.targetColumn],\n required: relation.required,\n unique: field.config.unique === true || field.relation?.unique === true,\n kind: relation.kind,\n ...(relation.relationType && { relationType: relation.relationType }),\n ...(relation.forwardName && { forwardName: relation.forwardName }),\n ...(relation.backwardName && { backwardName: relation.backwardName }),\n };\n}\n\nfunction buildRelations(types: Record<string, TailorDBType>): TailorDbErdRelation[] {\n const relations: TailorDbErdRelation[] = [];\n for (const type of Object.values(types)) {\n for (const field of Object.values(type.fields)) {\n const relation = toRelation(type.name, field);\n if (relation) {\n relations.push(relation);\n }\n }\n }\n return relations.toSorted((a, b) => a.name.localeCompare(b.name));\n}\n\n/**\n * Build the TailorDB ERD viewer schema for one namespace.\n * @param options - Schema build options.\n * @returns TailorDB ERD viewer schema.\n */\nexport function buildTailorDbErdSchema(options: BuildTailorDbErdSchemaOptions): TailorDbErdSchema {\n const { namespaceData } = options;\n const tables = Object.values(namespaceData.types)\n .toSorted((a, b) => a.name.localeCompare(b.name))\n .map((type) => toTable(type, namespaceData.sourceInfo.get(type.name)));\n\n const schemaWithoutRevision = {\n version: 1 as const,\n namespace: namespaceData.namespace,\n source: options.source ?? \"local\",\n cleanRoom: {\n implementation: \"tailor-sdk\" as const,\n notes: CLEAN_ROOM_NOTES,\n },\n tables,\n relations: buildRelations(namespaceData.types),\n };\n\n return {\n ...schemaWithoutRevision,\n generatedAt: options.generatedAt ?? new Date().toISOString(),\n revision: buildRevision(schemaWithoutRevision),\n };\n}\n\n/**\n * Writes a TailorDB ERD viewer schema to disk.\n * @param options - Schema write options.\n */\nexport function writeTailorDbErdSchemaToFile(options: WriteTailorDbErdSchemaOptions): void {\n const json = JSON.stringify(options.schema, null, 2);\n fs.mkdirSync(path.dirname(options.outputPath), { recursive: true });\n fs.writeFileSync(options.outputPath, json, \"utf8\");\n\n const relativePath = path.relative(process.cwd(), options.outputPath);\n logger.success(`Wrote ERD schema to ${relativePath}`);\n}\n","import { logBetaWarning } from \"@/cli/shared/beta\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport type { OperatorClient } from \"@/cli/shared/client\";\n\nexport interface ErdDeployContext {\n client: OperatorClient;\n workspaceId: string;\n}\n\ntype ErdDeployContextOptions = {\n profile?: string;\n workspaceId?: string;\n};\n\n/**\n * Initialize shared ERD command behavior.\n */\nexport function initErdCommand(): void {\n logBetaWarning(\"tailordb erd\");\n}\n\n/**\n * Initialize platform context for ERD deployment.\n * @param args - CLI arguments.\n * @returns Initialized deploy context.\n */\nexport async function initErdDeployContext(\n args: ErdDeployContextOptions,\n): Promise<ErdDeployContext> {\n initErdCommand();\n const accessToken = await loadAccessToken({\n useProfile: true,\n profile: args.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: args.workspaceId,\n profile: args.profile,\n });\n\n return { client, workspaceId };\n}\n","import * as fs from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport * as path from \"pathe\";\nimport type { TailorDbErdSchema } from \"./types\";\n\nconst VIEWER_ASSETS_DIR = \"erd-viewer-assets\";\nconst STYLES_LINK = '<link rel=\"stylesheet\" href=\"./styles.css\" />';\nconst APP_SCRIPT = '<script src=\"./app.js\" type=\"module\"></script>';\n\nexport interface WriteViewerDistOptions {\n schema: TailorDbErdSchema;\n distDir: string;\n}\n\nexport interface BuildViewerHtmlOptions {\n schema: TailorDbErdSchema;\n}\n\nfunction assetDirCandidates(): string[] {\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\n return [\n path.join(currentDir, \"viewer-assets\"),\n path.join(currentDir, VIEWER_ASSETS_DIR),\n path.join(currentDir, \"commands\", \"tailordb\", \"erd\", VIEWER_ASSETS_DIR),\n path.resolve(process.cwd(), \"packages/sdk/src/cli/commands/tailordb/erd/viewer-assets\"),\n ];\n}\n\n/**\n * Resolve the packaged ERD viewer asset directory.\n * @returns Absolute path to the viewer asset directory.\n */\nexport function resolveViewerAssetsDir(): string {\n for (const candidate of assetDirCandidates()) {\n if (fs.existsSync(path.join(candidate, \"index.html\"))) {\n return candidate;\n }\n }\n\n throw new Error(`ERD viewer assets not found. Checked: ${assetDirCandidates().join(\", \")}`);\n}\n\n/**\n * Build the self-contained ERD viewer HTML document. CSS, JS, and the schema\n * are inlined as separately extractable blocks: a `<style>` element, a\n * `<script type=\"module\">`, and a `<script type=\"application/json\"\n * id=\"erd-schema\">` data block. This renders without any sibling asset files\n * and lets external tooling (e.g. a future ERD diff) pull out the schema via\n * `JSON.parse`.\n * @param options - Viewer build options.\n * @returns The self-contained HTML document.\n */\nexport function buildViewerHtml(options: BuildViewerHtmlOptions): string {\n const assetsDir = resolveViewerAssetsDir();\n const html = fs.readFileSync(path.join(assetsDir, \"index.html\"), \"utf8\");\n const css = fs.readFileSync(path.join(assetsDir, \"styles.css\"), \"utf8\");\n const appJs = fs.readFileSync(path.join(assetsDir, \"app.js\"), \"utf8\");\n\n if (!html.includes(STYLES_LINK) || !html.includes(APP_SCRIPT)) {\n throw new Error(\"ERD viewer index.html is missing expected asset references for inlining.\");\n }\n\n // Embed the schema as JSON data (not executable JS) so it is both consumed by\n // the viewer and trivially extractable by external tooling (e.g. a future ERD\n // diff). Escape \"<\" so a value like \"</script>\" cannot terminate the data\n // <script> element early; JSON.parse restores the original characters.\n const schemaJson = JSON.stringify(options.schema).replaceAll(\"<\", \"\\\\u003c\");\n const embedScript = `<script type=\"application/json\" id=\"erd-schema\">${schemaJson}</script>`;\n // Escape any \"</script\" in the inlined module so it cannot terminate the\n // <script> element early. \"<\\/script\" is equivalent JS (\\/ === /).\n const safeAppJs = appJs.replace(/<\\/script/gi, \"<\\\\/script\");\n const inlineScript = `<script type=\"module\">\\n${safeAppJs}\\n</script>`;\n\n return html\n .replace(STYLES_LINK, `<style>\\n${css}\\n</style>`)\n .replace(APP_SCRIPT, `${embedScript}\\n ${inlineScript}`);\n}\n\n/**\n * Write the self-contained TailorDB ERD viewer to `<distDir>/index.html`.\n * @param options - Viewer dist write options.\n */\nexport function writeViewerDist(options: WriteViewerDistOptions): void {\n fs.rmSync(options.distDir, { recursive: true, force: true });\n fs.mkdirSync(options.distDir, { recursive: true });\n fs.writeFileSync(\n path.join(options.distDir, \"index.html\"),\n buildViewerHtml({ schema: options.schema }),\n \"utf8\",\n );\n}\n","import * as path from \"pathe\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { configArg } from \"@/cli/shared/args\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { loadLocalErdSchema, type LocalErdSchemaContext } from \"./local-schema\";\nimport { buildTailorDbErdSchema } from \"./schema\";\nimport { initErdCommand } from \"./utils\";\nimport { writeViewerDist } from \"./viewer\";\nimport type { TailorDBNamespaceData } from \"@/types/plugin-generation\";\n\nconst DEFAULT_ERD_BASE_DIR = \".tailor-sdk/erd\";\n\ninterface ResolveTargetsOptions {\n context: LocalErdSchemaContext;\n namespace?: string;\n outputDir: string;\n requireErdSite?: boolean;\n}\n\ninterface ErdTarget {\n namespaceData: TailorDBNamespaceData;\n erdSite?: string;\n distDir: string;\n}\n\ninterface ErdBuildsOptions {\n configPath?: string;\n namespace?: string;\n outputDir?: string;\n requireErdSite?: boolean;\n}\n\ninterface ErdBuildsFromContextOptions {\n context: LocalErdSchemaContext;\n namespace?: string;\n outputDir?: string;\n requireErdSite?: boolean;\n}\n\nexport interface ErdBuildResult {\n namespace: string;\n erdSite?: string;\n distDir: string;\n}\n\nfunction getErdSite(context: LocalErdSchemaContext, namespace: string): string | undefined {\n const dbConfig = context.config.db?.[namespace];\n if (!dbConfig || \"external\" in dbConfig) {\n return undefined;\n }\n return dbConfig.erdSite;\n}\n\nfunction resolveExplicitTarget(options: ResolveTargetsOptions): ErdTarget {\n const namespaceData = options.context.namespaces.find(\n (candidate) => candidate.namespace === options.namespace,\n );\n if (!namespaceData) {\n const available = options.context.namespaces.map((candidate) => candidate.namespace).join(\", \");\n throw new Error(\n `TailorDB namespace \"${options.namespace}\" not found in local config.db.` +\n (available ? ` Available owned namespaces: ${available}` : \"\"),\n );\n }\n\n const erdSite = getErdSite(options.context, namespaceData.namespace);\n if (options.requireErdSite && !erdSite) {\n throw new Error(\n `No erdSite configured for namespace \"${namespaceData.namespace}\". ` +\n `Add erdSite: \"<static-website-name>\" to db.${namespaceData.namespace} in tailor.config.ts.`,\n );\n }\n\n return toTarget(options.outputDir, namespaceData, erdSite);\n}\n\nfunction resolveAllTargets(options: ResolveTargetsOptions): ErdTarget[] {\n const namespaces = options.context.namespaces.filter(\n (namespaceData) =>\n !options.requireErdSite || getErdSite(options.context, namespaceData.namespace),\n );\n if (namespaces.length === 0) {\n throw new Error(\n options.requireErdSite\n ? \"No namespaces with erdSite configured found. \" +\n 'Add erdSite: \"<static-website-name>\" to db.<namespace> in tailor.config.ts.'\n : \"No TailorDB namespaces found in config. Please define db services in tailor.config.ts.\",\n );\n }\n\n logger.info(\n `Found ${namespaces.length} namespace(s)${options.requireErdSite ? \" with erdSite configured\" : \"\"}.`,\n );\n return namespaces.map((namespaceData) =>\n toTarget(\n options.outputDir,\n namespaceData,\n getErdSite(options.context, namespaceData.namespace),\n ),\n );\n}\n\nfunction toTarget(\n outputDir: string,\n namespaceData: TailorDBNamespaceData,\n erdSite: string | undefined,\n): ErdTarget {\n const distDir = path.join(outputDir, namespaceData.namespace, \"dist\");\n return {\n namespaceData,\n erdSite,\n distDir,\n };\n}\n\nfunction resolveTargets(options: ResolveTargetsOptions): ErdTarget[] {\n if (options.namespace) {\n return [resolveExplicitTarget(options)];\n }\n return resolveAllTargets(options);\n}\n\nfunction prepareErdBuild(target: ErdTarget): ErdBuildResult {\n const schema = buildTailorDbErdSchema({ namespaceData: target.namespaceData });\n writeViewerDist({ schema, distDir: target.distDir });\n\n const relativePath = path.relative(process.cwd(), target.distDir);\n logger.success(`Built ERD to ${relativePath}`);\n\n return {\n namespace: target.namespaceData.namespace,\n erdSite: target.erdSite,\n distDir: target.distDir,\n };\n}\n\n/**\n * Prepare TailorDB ERD static viewer builds for one or more namespaces.\n * @param options - Build options.\n * @returns Build results by namespace.\n */\nexport async function prepareErdBuilds(options: ErdBuildsOptions): Promise<ErdBuildResult[]> {\n const context = await loadLocalErdSchema({\n configPath: options.configPath,\n namespaces: options.namespace ? [options.namespace] : undefined,\n requireErdSite: options.requireErdSite,\n });\n return prepareErdBuildsFromContext({\n context,\n namespace: options.namespace,\n outputDir: options.outputDir,\n requireErdSite: options.requireErdSite,\n });\n}\n\n/**\n * Prepare TailorDB ERD static viewer builds from an already loaded schema context.\n * @param options - Build options.\n * @returns Build results by namespace.\n */\nexport function prepareErdBuildsFromContext(\n options: ErdBuildsFromContextOptions,\n): ErdBuildResult[] {\n const outputDir = path.resolve(process.cwd(), options.outputDir ?? DEFAULT_ERD_BASE_DIR);\n const targets = resolveTargets({\n context: options.context,\n namespace: options.namespace,\n outputDir,\n requireErdSite: options.requireErdSite,\n });\n\n return targets.map((target) => prepareErdBuild(target));\n}\n\nexport const erdExportCommand = defineAppCommand({\n name: \"export\",\n description: \"Export TailorDB ERD static viewer from local TailorDB schema.\",\n args: z\n .object({\n ...configArg,\n namespace: arg(z.string().optional(), {\n alias: \"n\",\n description:\n \"TailorDB namespace name (optional if only one namespace is defined in config)\",\n }),\n output: arg(z.string().default(DEFAULT_ERD_BASE_DIR), {\n alias: \"o\",\n description:\n \"Output directory path for TailorDB ERD viewer files (writes to `<outputDir>/<namespace>/dist`)\",\n completion: { type: \"directory\" },\n }),\n })\n .strict(),\n run: async (args) => {\n initErdCommand();\n\n const results = await prepareErdBuilds({\n configPath: args.config,\n namespace: args.namespace,\n outputDir: args.output,\n });\n\n logger.newline();\n if (args.json) {\n logger.out(\n results.map((result) => ({\n namespace: result.namespace,\n distDir: result.distDir,\n })),\n );\n } else {\n for (const result of results) {\n logger.out(`Exported ERD for namespace \"${result.namespace}\"`);\n logger.out(` - ERD viewer: ${path.join(result.distDir, \"index.html\")}`);\n }\n }\n },\n});\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { deploymentArgs } from \"@/cli/shared/args\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport { deployStaticWebsite, logSkippedFiles } from \"../../staticwebsite/deploy\";\nimport { prepareErdBuilds } from \"./export\";\nimport { initErdDeployContext } from \"./utils\";\n\nexport const erdDeployCommand = defineAppCommand({\n name: \"deploy\",\n description: \"Deploy ERD static website for TailorDB namespace(s).\",\n args: z\n .object({\n ...deploymentArgs,\n namespace: arg(z.string().optional(), {\n alias: \"n\",\n description:\n \"TailorDB namespace name (optional - deploys all namespaces with erdSite if omitted)\",\n }),\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n const { client, workspaceId } = await initErdDeployContext(args);\n const buildResults = await prepareErdBuilds({\n configPath: args.config,\n namespace: args.namespace,\n requireErdSite: true,\n });\n\n const deployResults = await Promise.all(\n buildResults.map(async (result) => {\n if (!result.erdSite) {\n throw new Error(\n `No erdSite configured for namespace \"${result.namespace}\". ` +\n `Add erdSite: \"<static-website-name>\" to db.${result.namespace} in tailor.config.ts.`,\n );\n }\n\n if (!args.json) {\n logger.info(\n `Deploying ERD for namespace \"${result.namespace}\" to site \"${result.erdSite}\"...`,\n );\n }\n\n const { url, skippedFiles } = await deployStaticWebsite(\n client,\n workspaceId,\n result.erdSite,\n result.distDir,\n !args.json,\n );\n\n return {\n namespace: result.namespace,\n erdSite: result.erdSite,\n url,\n skippedFiles,\n };\n }),\n );\n logger.newline();\n\n if (args.json) {\n logger.out(deployResults);\n } else {\n for (const result of deployResults) {\n logSkippedFiles(result.skippedFiles);\n logger.newline();\n logger.success(`ERD site \"${result.erdSite}\" deployed successfully.`);\n logger.out(result.url);\n }\n }\n },\n});\n","import { spawn } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport { glob } from \"node:fs/promises\";\nimport * as http from \"node:http\";\nimport { watch, type FSWatcher } from \"chokidar\";\nimport { lookup as lookupMime } from \"mime-types\";\nimport open from \"open\";\nimport * as path from \"pathe\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { configArg } from \"@/cli/shared/args\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadConfig, type LoadedConfig } from \"@/cli/shared/config-loader\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { prepareErdBuildsFromContext, type ErdBuildResult } from \"./export\";\nimport { loadLocalErdSchema, type LocalErdSchemaContext } from \"./local-schema\";\nimport { initErdCommand } from \"./utils\";\n\nconst DEFAULT_ERD_BASE_DIR = \".tailor-sdk/erd\";\nconst LOCAL_HOST = \"127.0.0.1\";\n\ninterface StaticServerResult {\n server: http.Server;\n url: string;\n}\n\ninterface StartStaticServerOptions {\n distDir: string;\n port: number;\n}\n\ninterface WatchOptions {\n configPath?: string;\n namespace?: string;\n outputDir: string;\n initialContext: LocalErdSchemaContext;\n initialResults: ErdBuildResult[];\n}\n\ninterface FreshErdExportOptions {\n configPath?: string;\n namespace?: string;\n outputDir: string;\n}\n\ninterface ErdExportJsonResult {\n namespace: string;\n distDir: string;\n}\n\ninterface OpenStaticFileResult {\n filePath: string;\n fd: number;\n}\n\nconst GLOB_CHARS = /[*?[\\]{}()!+@]/;\n\nfunction formatServeCommand(namespace: string): string {\n return `tailor-sdk tailordb erd serve --namespace ${namespace}`;\n}\n\nfunction getCacheControl(filePath: string): string {\n return filePath.endsWith(\".html\") || filePath.endsWith(\".json\")\n ? \"no-cache\"\n : \"public, max-age=3600\";\n}\n\nfunction resolveRequestPath(distDir: string, requestUrl: string | undefined): string | undefined {\n const url = new URL(requestUrl ?? \"/\", \"http://localhost\");\n let pathname: string;\n try {\n pathname = decodeURIComponent(url.pathname);\n } catch {\n return undefined;\n }\n\n if (pathname === \"/\" || pathname.endsWith(\"/\")) {\n pathname = path.join(pathname, \"index.html\");\n }\n\n const root = path.resolve(distDir);\n const filePath = path.resolve(root, `.${pathname}`);\n if (filePath !== root && !filePath.startsWith(`${root}${path.sep}`)) {\n return undefined;\n }\n return filePath;\n}\n\nfunction openStaticFile(filePath: string): OpenStaticFileResult | undefined {\n let fd: number | undefined;\n try {\n fd = fs.openSync(filePath, \"r\");\n if (!fs.fstatSync(fd).isFile()) {\n fs.closeSync(fd);\n return undefined;\n }\n return { filePath, fd };\n } catch {\n if (fd !== undefined) {\n fs.closeSync(fd);\n }\n return undefined;\n }\n}\n\nfunction serveFile(distDir: string, req: http.IncomingMessage, res: http.ServerResponse): void {\n const filePath = resolveRequestPath(distDir, req.url);\n if (!filePath) {\n res.writeHead(403);\n res.end(\"Forbidden\");\n return;\n }\n\n const fallbackPath = path.join(distDir, \"index.html\");\n const target = openStaticFile(filePath) ?? openStaticFile(fallbackPath);\n if (!target) {\n res.writeHead(503, {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n \"Cache-Control\": \"no-cache\",\n \"Retry-After\": \"1\",\n });\n res.end(\"ERD build is refreshing. Please retry.\");\n return;\n }\n\n const mimeType = lookupMime(target.filePath) || \"application/octet-stream\";\n const stream = fs.createReadStream(target.filePath, {\n fd: target.fd,\n autoClose: true,\n });\n stream.on(\"error\", () => {\n if (!res.headersSent) {\n res.writeHead(503, {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n \"Cache-Control\": \"no-cache\",\n \"Retry-After\": \"1\",\n });\n res.end(\"ERD build is refreshing. Please retry.\");\n return;\n }\n res.destroy();\n });\n res.writeHead(200, {\n \"Content-Type\": mimeType,\n \"Cache-Control\": getCacheControl(target.filePath),\n });\n stream.pipe(res);\n}\n\nasync function startStaticServer(options: StartStaticServerOptions): Promise<StaticServerResult> {\n const server = http.createServer((req, res) => {\n serveFile(options.distDir, req, res);\n });\n\n return await new Promise<StaticServerResult>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(options.port, LOCAL_HOST, () => {\n server.off(\"error\", reject);\n const address = server.address();\n if (!address || typeof address === \"string\") {\n reject(new Error(\"Failed to determine ERD server address.\"));\n return;\n }\n resolve({\n server,\n url: `http://${LOCAL_HOST}:${address.port}`,\n });\n });\n });\n}\n\nfunction getWatchPatterns(config: LoadedConfig, results: ErdBuildResult[]): string[] {\n const namespaces = new Set(results.map((result) => result.namespace));\n const patterns = [config.path];\n for (const namespace of namespaces) {\n const dbConfig = config.db?.[namespace];\n if (dbConfig && !(\"external\" in dbConfig)) {\n patterns.push(...dbConfig.files);\n }\n }\n return [...new Set(patterns)];\n}\n\nfunction hasGlobPattern(pattern: string): boolean {\n return GLOB_CHARS.test(pattern);\n}\n\nfunction globBaseDir(pattern: string): string {\n const absolutePattern = path.resolve(pattern);\n const parsed = path.parse(absolutePattern);\n const relativePattern = absolutePattern.slice(parsed.root.length);\n const literalParts: string[] = [];\n for (const part of relativePattern.split(path.sep)) {\n if (!part || GLOB_CHARS.test(part)) break;\n literalParts.push(part);\n }\n\n const literalPath =\n literalParts.length > 0 ? path.join(parsed.root, ...literalParts) : parsed.root;\n if (!literalPath || literalPath === parsed.root) return parsed.root || process.cwd();\n if (!fs.existsSync(literalPath)) return path.dirname(literalPath);\n return fs.statSync(literalPath).isDirectory() ? literalPath : path.dirname(literalPath);\n}\n\nasync function expandWatchPattern(pattern: string): Promise<string[]> {\n if (!hasGlobPattern(pattern)) {\n return [path.resolve(pattern)];\n }\n\n const paths = new Set<string>();\n for await (const file of glob(pattern)) {\n paths.add(path.resolve(file));\n }\n\n const baseDir = globBaseDir(pattern);\n if (fs.existsSync(baseDir) && fs.statSync(baseDir).isDirectory()) {\n paths.add(baseDir);\n }\n return [...paths];\n}\n\nasync function resolveWatchPathsFromConfig(\n config: LoadedConfig,\n results: ErdBuildResult[],\n): Promise<string[]> {\n const paths = new Set<string>();\n for (const pattern of getWatchPatterns(config, results)) {\n for (const watchPath of await expandWatchPattern(pattern)) {\n paths.add(watchPath);\n }\n }\n return [...paths];\n}\n\nexport async function resolveWatchPaths(\n context: LocalErdSchemaContext,\n results: ErdBuildResult[],\n): Promise<string[]> {\n return await resolveWatchPathsFromConfig(context.config, results);\n}\n\nfunction parseFreshErdExportResults(stdout: string): ErdBuildResult[] {\n const lines = stdout\n .trim()\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n for (const line of lines.toReversed()) {\n try {\n const parsed = JSON.parse(line) as unknown;\n if (!Array.isArray(parsed)) continue;\n return parsed.map((entry): ErdBuildResult => {\n const result = entry as Partial<ErdExportJsonResult>;\n if (typeof result.namespace !== \"string\" || typeof result.distDir !== \"string\") {\n throw new Error(\"Invalid ERD export JSON output.\");\n }\n return {\n namespace: result.namespace,\n distDir: result.distDir,\n };\n });\n } catch {\n continue;\n }\n }\n throw new Error(\"Failed to parse ERD export JSON output.\");\n}\n\nfunction freshErdExportArgs(options: FreshErdExportOptions): string[] {\n const cliEntry = process.argv[1];\n if (!cliEntry) {\n throw new Error(\"Cannot rebuild ERD schema in a fresh process: CLI entrypoint is unavailable.\");\n }\n\n const args = [cliEntry, \"tailordb\", \"erd\", \"export\", \"--output\", options.outputDir, \"--json\"];\n if (options.configPath) {\n args.push(\"--config\", options.configPath);\n }\n if (options.namespace) {\n args.push(\"--namespace\", options.namespace);\n }\n return args;\n}\n\nasync function runFreshErdExport(options: FreshErdExportOptions): Promise<ErdBuildResult[]> {\n return await new Promise<ErdBuildResult[]>((resolve, reject) => {\n const child = spawn(process.execPath, freshErdExportArgs(options), {\n cwd: process.cwd(),\n env: process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n let stdout = \"\";\n let stderr = \"\";\n child.stdout.setEncoding(\"utf8\");\n child.stderr.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => {\n stdout += chunk;\n });\n child.stderr.on(\"data\", (chunk: string) => {\n stderr += chunk;\n });\n child.on(\"error\", reject);\n child.on(\"close\", (code, signal) => {\n if (code !== 0) {\n const detail = stderr.trim() || signal || `exit code ${code}`;\n reject(new Error(`Fresh ERD export failed: ${detail}`));\n return;\n }\n try {\n resolve(parseFreshErdExportResults(stdout));\n } catch (error) {\n reject(error);\n }\n });\n });\n}\n\nfunction selectPrimaryResult(results: ErdBuildResult[]): ErdBuildResult {\n const [primary, ...rest] = results;\n if (!primary) {\n throw new Error(\"No ERD build results found.\");\n }\n\n logger.info(`Serving ERD for namespace \"${primary.namespace}\".`);\n if (rest.length > 0) {\n const commands = rest.map((result) => ` - ${formatServeCommand(result.namespace)}`).join(\"\\n\");\n logger.warn(`Multiple namespaces found. To serve another namespace, run:\\n${commands}`);\n }\n\n return primary;\n}\n\nasync function createErdWatcher(options: WatchOptions): Promise<FSWatcher> {\n let rebuilding = false;\n let pending = false;\n let watchPaths = await resolveWatchPaths(options.initialContext, options.initialResults);\n let importNonce = 0;\n\n const watcher = watch(watchPaths, {\n ignored: /node_modules/,\n ignoreInitial: true,\n awaitWriteFinish: {\n stabilityThreshold: 100,\n pollInterval: 100,\n },\n });\n\n async function rebuild(): Promise<void> {\n if (rebuilding) {\n pending = true;\n return;\n }\n\n rebuilding = true;\n try {\n const results = await runFreshErdExport({\n configPath: options.configPath,\n namespace: options.namespace,\n outputDir: options.outputDir,\n });\n const { config } = await loadConfig(options.configPath, {\n importNonce: String((importNonce += 1)),\n });\n const nextWatchPaths = await resolveWatchPathsFromConfig(config, results);\n watcher.unwatch(watchPaths);\n watcher.add(nextWatchPaths);\n watchPaths = nextWatchPaths;\n logger.success(\n `Rebuilt ERD schema (${results.map((result) => result.namespace).join(\", \")})`,\n {\n mode: \"stream\",\n },\n );\n } catch (error) {\n logger.error(\"Failed to rebuild ERD schema. Serving the last successful build.\", {\n mode: \"stream\",\n });\n logger.error(String(error));\n } finally {\n rebuilding = false;\n if (pending) {\n pending = false;\n await rebuild();\n }\n }\n }\n\n let debounceTimer: NodeJS.Timeout | undefined;\n const scheduleRebuild = (changedPath: string) => {\n logger.info(`Schema source changed: ${path.relative(process.cwd(), changedPath)}`, {\n mode: \"stream\",\n });\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n debounceTimer = setTimeout(() => {\n rebuild();\n }, 150);\n };\n\n watcher.on(\"add\", scheduleRebuild);\n watcher.on(\"change\", scheduleRebuild);\n watcher.on(\"unlink\", scheduleRebuild);\n watcher.on(\"error\", (error) => {\n logger.error(`ERD watcher error: ${String(error)}`, { mode: \"stream\" });\n });\n\n return watcher;\n}\n\nasync function waitForShutdown(server: http.Server, watcher: FSWatcher): Promise<void> {\n return await new Promise<void>((resolve) => {\n const shutdown = () => {\n watcher.close().finally(() => {\n server.close(() => {\n logger.info(\"ERD server stopped.\");\n resolve();\n });\n });\n };\n\n process.once(\"SIGINT\", shutdown);\n process.once(\"SIGTERM\", shutdown);\n });\n}\n\nexport const erdServeCommand = defineAppCommand({\n name: \"serve\",\n description: \"Generate and serve TailorDB ERD locally with watch reload. (beta)\",\n args: z\n .object({\n ...configArg,\n namespace: arg(z.string().optional(), {\n alias: \"n\",\n description: \"TailorDB namespace name (uses first namespace in config if not specified)\",\n }),\n port: arg(z.coerce.number().int().min(0).max(65535).default(0), {\n description: \"Local server port (0 selects a free port)\",\n }),\n open: arg(z.boolean().default(false), {\n description: \"Open the ERD viewer in the default browser\",\n }),\n })\n .strict(),\n run: async (args) => {\n initErdCommand();\n\n const outputDir = path.resolve(process.cwd(), DEFAULT_ERD_BASE_DIR);\n const context = await loadLocalErdSchema({\n configPath: args.config,\n namespaces: args.namespace ? [args.namespace] : undefined,\n });\n const results = prepareErdBuildsFromContext({\n context,\n namespace: args.namespace,\n outputDir,\n });\n const primary = selectPrimaryResult(results);\n const { server, url } = await startStaticServer({\n distDir: primary.distDir,\n port: args.port,\n });\n const watchUrl = `${url}/?watch=1`;\n const watcher = await createErdWatcher({\n configPath: args.config,\n namespace: args.namespace,\n outputDir,\n initialContext: context,\n initialResults: results,\n });\n\n logger.newline();\n if (args.json) {\n logger.out({\n namespace: primary.namespace,\n url: watchUrl,\n distDir: primary.distDir,\n });\n } else {\n logger.success(\"ERD server started.\");\n logger.out(watchUrl);\n }\n\n if (args.open) {\n try {\n await open(watchUrl);\n } catch {\n logger.warn(\"Failed to open browser automatically. Please open the URL above manually.\");\n }\n }\n\n await waitForShutdown(server, watcher);\n },\n});\n","import { defineCommand } from \"politty\";\nimport { erdDeployCommand } from \"./deploy\";\nimport { erdExportCommand } from \"./export\";\nimport { erdServeCommand } from \"./serve\";\n\nexport const erdCommand = defineCommand({\n name: \"erd\",\n description: \"Generate TailorDB ERD viewer artifacts from local TailorDB schema. (beta)\",\n subCommands: {\n export: erdExportCommand,\n serve: erdServeCommand,\n deploy: erdDeployCommand,\n },\n});\n","/**\n * Script command for TailorDB migrations\n *\n * Adds a `migrate.ts` (and supporting `db.ts`) template to an existing\n * migration directory. Useful for warning-tier changes where users may\n * want to write a custom data migration even though the change does not\n * automatically require one.\n */\n\nimport * as fs from \"node:fs\";\nimport * as fsPromises from \"node:fs/promises\";\nimport * as path from \"pathe\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { configArg } from \"@/cli/shared/args\";\nimport { logBetaWarning } from \"@/cli/shared/beta\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadConfig } from \"@/cli/shared/config-loader\";\nimport { getConfiguredEditorCommand, openInConfiguredEditor } from \"@/cli/shared/editor\";\nimport { logger, styles } from \"@/cli/shared/logger\";\nimport { getNamespacesWithMigrations, type NamespaceWithMigrations } from \"./config\";\nimport { writeDbTypesFile } from \"./db-types-generator\";\nimport {\n getMigrationFilePath,\n isValidMigrationNumber,\n loadDiff,\n reconstructSnapshotFromMigrations,\n INITIAL_SCHEMA_NUMBER,\n} from \"./snapshot\";\nimport { generateMigrationScript } from \"./template-generator\";\n\nexport interface ScriptOptions {\n configPath?: string;\n number: string;\n namespace?: string;\n}\n\n/**\n * Add a migrate.ts template to an existing migration directory.\n * @param {ScriptOptions} options - Command options\n */\nasync function script(options: ScriptOptions): Promise<void> {\n logBetaWarning(\"tailordb migration\");\n\n // Accept either the canonical 4-digit form (\"0001\") or a bare integer\n // (\"1\"–\"9999\"). Reject inputs containing non-digit characters, integer\n // forms with leading zeros (\"00001\"), and anything outside the\n // 0000-9999 directory range that the migrations system supports.\n let migrationNumber: number;\n if (isValidMigrationNumber(options.number)) {\n migrationNumber = parseInt(options.number, 10);\n } else if (/^[1-9]\\d*$/.test(options.number)) {\n migrationNumber = parseInt(options.number, 10);\n if (migrationNumber > 9999) {\n throw new Error(`Migration number ${options.number} is out of range. Expected 1-9999.`);\n }\n } else {\n throw new Error(\n `Invalid migration number format: ${options.number}. Expected 4-digit format (e.g., 0001) or integer 1-9999 (e.g., 1).`,\n );\n }\n\n if (migrationNumber === INITIAL_SCHEMA_NUMBER) {\n throw new Error(\n `Migration ${options.number} is the initial schema snapshot and cannot have a migration script.`,\n );\n }\n\n const { config } = await loadConfig(options.configPath);\n const configDir = path.dirname(config.path);\n\n const namespacesWithMigrations = getNamespacesWithMigrations(config, configDir);\n if (namespacesWithMigrations.length === 0) {\n throw new Error(\"No TailorDB services with migrations configuration found\");\n }\n\n const targetNamespace = resolveTargetNamespace(namespacesWithMigrations, options.namespace);\n const { migrationsDir } = namespacesWithMigrations.find(\n (ns) => ns.namespace === targetNamespace,\n )!;\n\n const diffPath = getMigrationFilePath(migrationsDir, migrationNumber, \"diff\");\n if (!fs.existsSync(diffPath)) {\n throw new Error(\n `Migration ${options.number} not found in ${migrationsDir}. Expected ${diffPath}.`,\n );\n }\n\n const migratePath = getMigrationFilePath(migrationsDir, migrationNumber, \"migrate\");\n if (fs.existsSync(migratePath)) {\n throw new Error(`Migration script already exists at ${migratePath}.`);\n }\n\n const diff = loadDiff(diffPath);\n\n // Reconstruct the schema state immediately before this migration so that\n // db.ts has Kysely types for the previous shape of the data.\n const previousSnapshot = reconstructSnapshotFromMigrations(migrationsDir, migrationNumber - 1);\n if (!previousSnapshot) {\n throw new Error(\n `Could not reconstruct previous schema for migration ${options.number}. Make sure migration ${INITIAL_SCHEMA_NUMBER} exists.`,\n );\n }\n\n const scriptContent = generateMigrationScript(diff);\n await fsPromises.writeFile(migratePath, scriptContent);\n await writeDbTypesFile(previousSnapshot, migrationsDir, migrationNumber, diff);\n\n logger.success(\n `Added migration script for migration ${styles.bold(options.number)} in namespace ${styles.bold(targetNamespace)}`,\n );\n logger.info(` Migration script: ${migratePath}`);\n logger.info(` DB types: ${getMigrationFilePath(migrationsDir, migrationNumber, \"db\")}`);\n\n logger.newline();\n logger.log(\"Edit the script to implement your data migration logic.\");\n logger.log(\"It will be executed by 'tailor-sdk deploy' between Pre and Post phases.\");\n\n const editor = getConfiguredEditorCommand();\n if (!editor) return;\n\n logger.newline();\n logger.info(`Opening ${path.basename(migratePath)} in ${editor}...`);\n try {\n await openInConfiguredEditor(migratePath);\n } catch {\n return;\n }\n}\n\nfunction resolveTargetNamespace(\n namespacesWithMigrations: NamespaceWithMigrations[],\n requested?: string,\n): string {\n if (requested) {\n if (!namespacesWithMigrations.some((ns) => ns.namespace === requested)) {\n throw new Error(`Namespace \"${requested}\" not found or does not have migrations configured`);\n }\n return requested;\n }\n if (namespacesWithMigrations.length === 1) {\n return namespacesWithMigrations[0].namespace;\n }\n throw new Error(\n `Multiple TailorDB services found. Please specify namespace with --namespace flag: ${namespacesWithMigrations.map((ns) => ns.namespace).join(\", \")}`,\n );\n}\n\nexport const scriptCommand = defineAppCommand({\n name: \"script\",\n description: \"Add a migration script (migrate.ts) template to an existing migration directory.\",\n args: z\n .object({\n ...configArg,\n number: arg(z.string(), {\n positional: true,\n description: \"Migration number to add a script to (e.g., 0001 or 1)\",\n }),\n namespace: arg(z.string().optional(), {\n alias: \"n\",\n description: \"Target TailorDB namespace (required if multiple namespaces exist)\",\n }),\n })\n .strict(),\n run: async (args) => {\n await script({\n configPath: args.config,\n number: args.number,\n namespace: args.namespace,\n });\n },\n});\n","import * as path from \"pathe\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { resourceTrn } from \"@/cli/commands/deploy/label\";\nimport { confirmationArgs, deploymentArgs } from \"@/cli/shared/args\";\nimport { logBetaWarning } from \"@/cli/shared/beta\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadConfig } from \"@/cli/shared/config-loader\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger, styles } from \"@/cli/shared/logger\";\nimport { prompt } from \"@/cli/shared/prompt\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport { getNamespacesWithMigrations } from \"./config\";\nimport { formatMigrationNumber, isValidMigrationNumber } from \"./snapshot\";\nimport { parseMigrationLabelNumber } from \"./types\";\n\nexport interface SetOptions {\n configPath?: string;\n number: string;\n namespace?: string;\n yes?: boolean;\n workspaceId?: string;\n profile?: string;\n}\n\n/**\n * Set migration checkpoint for a TailorDB namespace\n * @param {SetOptions} options - Command options\n */\nasync function set(options: SetOptions): Promise<void> {\n logBetaWarning(\"tailordb migration\");\n\n // 1. Validate migration number format\n const numberStr = options.number;\n\n // Accept either 4-digit format (0001) or integer (1)\n let migrationNumber: number;\n if (isValidMigrationNumber(numberStr)) {\n // 4-digit format\n migrationNumber = parseInt(numberStr, 10);\n } else {\n // Try parsing as integer\n migrationNumber = parseInt(numberStr, 10);\n if (isNaN(migrationNumber) || migrationNumber < 0) {\n throw new Error(\n `Invalid migration number format: ${numberStr}. Expected 4-digit format (e.g., 0001) or integer (e.g., 1).`,\n );\n }\n }\n\n // 2. Load configuration\n const { config } = await loadConfig(options.configPath);\n const configDir = path.dirname(config.path);\n\n // 3. Get namespaces with migrations\n const namespacesWithMigrations = getNamespacesWithMigrations(config, configDir);\n\n if (namespacesWithMigrations.length === 0) {\n throw new Error(\"No TailorDB services with migrations configuration found\");\n }\n\n // 4. Determine target namespace\n let targetNamespace: string;\n if (options.namespace) {\n if (!namespacesWithMigrations.some((ns) => ns.namespace === options.namespace)) {\n throw new Error(\n `Namespace \"${options.namespace}\" not found or does not have migrations configured`,\n );\n }\n targetNamespace = options.namespace;\n } else if (namespacesWithMigrations.length === 1) {\n targetNamespace = namespacesWithMigrations[0].namespace;\n } else {\n throw new Error(\n `Multiple TailorDB services found. Please specify namespace with --namespace flag: ${namespacesWithMigrations.map((ns) => ns.namespace).join(\", \")}`,\n );\n }\n\n // 5. Initialize client\n const accessToken = await loadAccessToken({\n useProfile: false,\n profile: options.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: options.workspaceId,\n profile: options.profile,\n });\n\n // 6. Get current migration number\n const trn = resourceTrn(workspaceId, \"tailordb\", targetNamespace);\n let currentMigration: number;\n try {\n const { metadata } = await client.getMetadata({ trn });\n const label = metadata?.labels?.[\"sdk-migration\"];\n currentMigration = label ? (parseMigrationLabelNumber(label) ?? 0) : 0;\n } catch {\n currentMigration = 0;\n }\n\n // 7. Display warning and confirmation\n logger.newline();\n logger.warn(\"This operation will change the migration checkpoint.\");\n logger.log(`Namespace: ${styles.bold(targetNamespace)}`);\n logger.log(`Current migration: ${styles.bold(formatMigrationNumber(currentMigration))}`);\n logger.log(`New migration: ${styles.bold(formatMigrationNumber(migrationNumber))}`);\n logger.newline();\n\n if (migrationNumber < currentMigration) {\n logger.warn(\n `Setting migration number backwards (${formatMigrationNumber(currentMigration)} → ${formatMigrationNumber(migrationNumber)}) will cause previous migrations to be re-executed on next apply.`,\n );\n logger.newline();\n } else if (migrationNumber > currentMigration) {\n logger.warn(\n `Setting migration number forwards (${formatMigrationNumber(currentMigration)} → ${formatMigrationNumber(migrationNumber)}) will skip migrations ${formatMigrationNumber(currentMigration + 1)} to ${formatMigrationNumber(migrationNumber)}.`,\n );\n logger.newline();\n }\n\n // 8. Confirmation prompt (unless --yes flag)\n if (!options.yes) {\n const confirmation = await prompt.confirm({\n message: \"Continue with migration checkpoint update?\",\n default: false,\n });\n\n if (!confirmation) {\n logger.info(\"Operation cancelled.\");\n return;\n }\n logger.newline();\n }\n\n // 9. Update migration label\n const { metadata } = await client.getMetadata({ trn });\n const existingLabels = metadata?.labels ?? {};\n\n await client.setMetadata({\n trn,\n labels: {\n ...existingLabels,\n \"sdk-migration\": `m${formatMigrationNumber(migrationNumber)}`,\n },\n });\n\n logger.success(\n `Migration checkpoint set to ${styles.bold(formatMigrationNumber(migrationNumber))} for namespace ${styles.bold(targetNamespace)}`,\n );\n}\n\nexport const setCommand = defineAppCommand({\n name: \"set\",\n description: \"Set migration checkpoint to a specific number.\",\n args: z\n .object({\n ...deploymentArgs,\n ...confirmationArgs,\n number: arg(z.string(), {\n positional: true,\n description: \"Migration number to set (e.g., 0001 or 1)\",\n }),\n namespace: arg(z.string().optional(), {\n alias: \"n\",\n description: \"Target TailorDB namespace (required if multiple namespaces exist)\",\n }),\n })\n .strict(),\n run: async (args) => {\n await assertWritable({ profile: args.profile });\n await set({\n configPath: args.config,\n number: args.number,\n namespace: args.namespace,\n yes: args.yes,\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n });\n },\n});\n","import * as fs from \"node:fs\";\nimport * as path from \"pathe\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { resourceTrn } from \"@/cli/commands/deploy/label\";\nimport { deploymentArgs } from \"@/cli/shared/args\";\nimport { logBetaWarning } from \"@/cli/shared/beta\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { loadConfig } from \"@/cli/shared/config-loader\";\nimport { loadAccessToken, loadWorkspaceId } from \"@/cli/shared/context\";\nimport { logger, styles } from \"@/cli/shared/logger\";\nimport { getNamespacesWithMigrations } from \"./config\";\nimport {\n getMigrationFiles,\n loadDiff,\n getMigrationFilePath,\n formatMigrationNumber,\n} from \"./snapshot\";\nimport { parseMigrationLabelNumber } from \"./types\";\n\nexport interface StatusOptions {\n configPath?: string;\n namespace?: string;\n workspaceId?: string;\n profile?: string;\n json?: boolean;\n}\n\ninterface PendingMigrationStatusInfo {\n number: number;\n label: string;\n description?: string;\n}\n\ninterface MigrationStatusInfo {\n namespace: string;\n currentMigration: number;\n currentMigrationLabel: string;\n pendingMigrations: PendingMigrationStatusInfo[];\n}\n\nasync function collectMigrationStatuses(options: StatusOptions): Promise<MigrationStatusInfo[]> {\n const { config } = await loadConfig(options.configPath);\n const configDir = path.dirname(config.path);\n\n const namespacesWithMigrations = getNamespacesWithMigrations(config, configDir);\n\n if (namespacesWithMigrations.length === 0) {\n throw new Error(\"No TailorDB services with migrations configuration found\");\n }\n\n const targetNamespaces = options.namespace\n ? namespacesWithMigrations.filter((ns) => ns.namespace === options.namespace)\n : namespacesWithMigrations;\n\n if (targetNamespaces.length === 0) {\n throw new Error(\n `Namespace \"${options.namespace}\" not found or does not have migrations configured`,\n );\n }\n\n const accessToken = await loadAccessToken({\n useProfile: false,\n profile: options.profile,\n });\n const client = await initOperatorClient(accessToken);\n const workspaceId = await loadWorkspaceId({\n workspaceId: options.workspaceId,\n profile: options.profile,\n });\n\n const statuses: MigrationStatusInfo[] = [];\n\n for (const { namespace, migrationsDir } of targetNamespaces) {\n const trn = resourceTrn(workspaceId, \"tailordb\", namespace);\n let currentMigration: number;\n try {\n const { metadata } = await client.getMetadata({ trn });\n const label = metadata?.labels?.[\"sdk-migration\"];\n currentMigration = label ? (parseMigrationLabelNumber(label) ?? 0) : 0;\n } catch {\n currentMigration = 0;\n }\n\n const migrationFiles = getMigrationFiles(migrationsDir);\n const availableNumbers = migrationFiles\n .map((f) => f.number)\n .filter((n, i, arr) => arr.indexOf(n) === i) // deduplicate\n .toSorted((a, b) => a - b);\n const pendingNumbers = availableNumbers.filter((n) => n > currentMigration);\n\n const pendingMigrations = pendingNumbers.map((num) => {\n const diffPath = getMigrationFilePath(migrationsDir, num, \"diff\");\n let description: string | undefined;\n\n if (fs.existsSync(diffPath)) {\n try {\n const diff = loadDiff(diffPath);\n description = diff.description;\n } catch {\n // Ignore errors loading diff\n }\n }\n\n return {\n number: num,\n label: formatMigrationNumber(num),\n ...(description ? { description } : {}),\n };\n });\n\n statuses.push({\n namespace,\n currentMigration,\n currentMigrationLabel: formatMigrationNumber(currentMigration),\n pendingMigrations,\n });\n }\n\n return statuses;\n}\n\nfunction printMigrationStatuses(statuses: MigrationStatusInfo[]): void {\n for (const statusInfo of statuses) {\n logger.newline();\n logger.info(`Namespace: ${styles.bold(statusInfo.namespace)}`);\n logger.log(` Current migration: ${styles.bold(statusInfo.currentMigrationLabel)}`);\n\n if (statusInfo.pendingMigrations.length > 0) {\n logger.log(\" Pending migrations:\");\n for (const pending of statusInfo.pendingMigrations) {\n if (pending.description) {\n logger.log(` - ${pending.label}: ${pending.description}`);\n } else {\n logger.log(` - ${pending.label}`);\n }\n }\n } else {\n logger.log(\" Pending migrations: (none)\");\n }\n }\n\n logger.newline();\n}\n\n/**\n * Show migration status for TailorDB namespaces\n * @param {StatusOptions} options - Command options\n */\nasync function status(options: StatusOptions): Promise<void> {\n logBetaWarning(\"tailordb migration\");\n\n const statuses = await collectMigrationStatuses(options);\n if (options.json) {\n logger.out(statuses);\n return;\n }\n\n printMigrationStatuses(statuses);\n}\n\nexport const statusCommand = defineAppCommand({\n name: \"status\",\n description:\n \"Show the current migration status for TailorDB namespaces, including applied and pending migrations.\",\n args: z\n .object({\n ...deploymentArgs,\n namespace: arg(z.string().optional(), {\n alias: \"n\",\n description: \"Target TailorDB namespace (shows all namespaces if not specified)\",\n }),\n })\n .strict(),\n run: async (args) => {\n await status({\n configPath: args.config,\n namespace: args.namespace,\n workspaceId: args[\"workspace-id\"],\n profile: args.profile,\n json: logger.jsonMode,\n });\n },\n});\n","/**\n * TailorDB migration command\n *\n * Subcommands:\n * - generate: Generate migration files from schema differences\n * - script: Add a migrate.ts template to an existing migration\n * - set: Set migration checkpoint to a specific number\n * - status: Show migration status for TailorDB namespaces\n */\n\nimport { defineCommand } from \"politty\";\nimport { generateCommand } from \"./generate\";\nimport { scriptCommand } from \"./script\";\nimport { setCommand } from \"./set\";\nimport { statusCommand } from \"./status\";\n\nexport const migrationCommand = defineCommand({\n name: \"migration\",\n description: \"Manage TailorDB schema migrations.\",\n subCommands: {\n generate: generateCommand,\n script: scriptCommand,\n set: setCommand,\n status: statusCommand,\n },\n});\n\nexport { generateCommand } from \"./generate\";\nexport type { GenerateOptions } from \"./generate\";\nexport { scriptCommand } from \"./script\";\nexport type { ScriptOptions } from \"./script\";\nexport { setCommand } from \"./set\";\nexport type { SetOptions } from \"./set\";\nexport { statusCommand } from \"./status\";\nexport type { StatusOptions } from \"./status\";\n","import { defineCommand } from \"politty\";\nimport { erdCommand } from \"./erd\";\nimport { migrationCommand } from \"./migrate\";\nimport { truncateCommand } from \"./truncate\";\n\nexport const tailordbCommand = defineCommand({\n name: \"tailordb\",\n description: \"Manage TailorDB tables and data.\",\n subCommands: {\n truncate: truncateCommand,\n migration: migrationCommand,\n erd: erdCommand,\n },\n});\n","import * as path from \"pathe\";\nimport { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\n\nexport const upgradeCommand = defineAppCommand({\n name: \"upgrade\",\n description: \"Run codemods to upgrade your project to a newer SDK version.\",\n args: z\n .object({\n from: arg(z.string(), {\n description: \"SDK version before the upgrade (e.g., 1.33.0)\",\n }),\n \"dry-run\": arg(z.boolean().default(false), {\n alias: \"d\",\n description: \"Preview changes without modifying files\",\n }),\n path: arg(z.string().default(\".\"), {\n description: \"Project directory to upgrade\",\n completion: { type: \"directory\" },\n }),\n })\n .strict(),\n run: async (args) => {\n const { initTelemetry } = await import(\"@/cli/telemetry\");\n await initTelemetry();\n\n const { upgrade } = await import(\"./service\");\n await upgrade({\n from: args.from,\n dryRun: args[\"dry-run\"],\n path: path.resolve(args.path),\n });\n },\n});\n","import { z } from \"zod\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { readPlatformConfig } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport ml from \"@/utils/multiline\";\n\nexport const currentCommand = defineAppCommand({\n name: \"current\",\n description: \"Show current user.\",\n args: z.object({}).strict(),\n run: async () => {\n const config = await readPlatformConfig();\n const jsonOutput = logger.jsonMode;\n\n // Check if current user is set\n if (!config.current_user) {\n throw new Error(ml`\n Current user not set.\n Please login first using 'tailor-sdk login' command to register a user.\n `);\n }\n\n // Check if user exists\n if (!config.users[config.current_user]) {\n throw new Error(ml`\n Current user '${config.current_user}' not found in registered users.\n Please login again using 'tailor-sdk login' command to register the user.\n `);\n }\n\n if (jsonOutput) {\n logger.out({ user: config.current_user });\n return;\n }\n\n logger.out(config.current_user);\n },\n});\n","import { z } from \"zod\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { readPlatformConfig } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport ml from \"@/utils/multiline\";\n\nexport const listCommand = defineAppCommand({\n name: \"list\",\n description: \"List all users.\",\n args: z.object({}).strict(),\n run: async () => {\n const config = await readPlatformConfig();\n const jsonOutput = logger.jsonMode;\n\n const users = Object.keys(config.users);\n if (users.length === 0) {\n logger.info(ml`\n No users found.\n Please login first using 'tailor-sdk login' command to register a user.\n `);\n if (jsonOutput) {\n logger.out([]);\n }\n return;\n }\n\n if (jsonOutput) {\n logger.out(users);\n return;\n }\n\n users.forEach((user) => {\n if (user === config.current_user) {\n logger.success(`${user} (current)`, { mode: \"plain\" });\n } else {\n logger.log(user);\n }\n });\n },\n});\n","import { PATScope } from \"@tailor-proto/tailor/v1/auth_resource_pb\";\nimport { logger } from \"@/cli/shared/logger\";\nimport ml from \"@/utils/multiline\";\nimport type { PersonalAccessToken } from \"@tailor-proto/tailor/v1/auth_resource_pb\";\n\nexport interface PersonalAccessTokenInfo {\n name: string;\n scopes: string[];\n}\n\nfunction patScopeToString(scope: PATScope): string {\n switch (scope) {\n case PATScope.PAT_SCOPE_READ:\n return \"read\";\n case PATScope.PAT_SCOPE_WRITE:\n return \"write\";\n default:\n return \"unknown\";\n }\n}\n\n/**\n * Transform a PersonalAccessToken into CLI-friendly info.\n * @param pat - Personal access token resource\n * @returns Flattened token info\n */\nexport function transformPersonalAccessToken(pat: PersonalAccessToken): PersonalAccessTokenInfo {\n return {\n name: pat.name,\n scopes: pat.scopes.map(patScopeToString),\n };\n}\n\n/**\n * Get PAT scopes from a write flag.\n * @param write - Whether write access is required\n * @returns Scopes to apply to the token\n */\nexport function getScopesFromWriteFlag(write: boolean): PATScope[] {\n return write ? [PATScope.PAT_SCOPE_READ, PATScope.PAT_SCOPE_WRITE] : [PATScope.PAT_SCOPE_READ];\n}\n\nfunction getScopeStringsFromWriteFlag(write: boolean): string[] {\n return write ? [\"read\", \"write\"] : [\"read\"];\n}\n\n/**\n * Print the created or updated personal access token to the logger.\n * @param name - Token name\n * @param token - Token value\n * @param write - Whether the token has write scope\n * @param action - Action performed\n */\nexport function printCreatedToken(\n name: string,\n token: string,\n write: boolean,\n action: \"created\" | \"updated\",\n): void {\n const scopes = getScopeStringsFromWriteFlag(write);\n\n if (logger.jsonMode) {\n logger.out({ name, scopes, token });\n } else {\n logger.log(ml`\n Personal access token ${action} successfully.\n\n name: ${name}\n scopes: ${scopes.join(\"/\")}\n token: ${token}\n\n Please save this token in a secure location. You won't be able to see it again.\n `);\n }\n}\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { fetchLatestToken, readPlatformConfig } from \"@/cli/shared/context\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport ml from \"@/utils/multiline\";\nimport { getScopesFromWriteFlag, printCreatedToken } from \"./transform\";\n\nexport const createCommand = defineAppCommand({\n name: \"create\",\n description: \"Create a new personal access token.\",\n args: z\n .object({\n name: arg(z.string(), {\n positional: true,\n description: \"Token name\",\n }),\n write: arg(z.boolean().default(false), {\n alias: \"W\",\n description: \"Grant write permission (default: read-only)\",\n }),\n })\n .strict(),\n run: async (args) => {\n await assertWritable();\n const config = await readPlatformConfig();\n\n if (!config.current_user) {\n throw new Error(ml`\n No user logged in.\n Please login first using 'tailor-sdk login' command.\n `);\n }\n\n const token = await fetchLatestToken(config, config.current_user);\n const client = await initOperatorClient(token);\n\n const scopes = getScopesFromWriteFlag(args.write);\n const result = await client.createPersonalAccessToken({\n name: args.name,\n scopes,\n });\n\n if (!result.accessToken) {\n throw new Error(\"Failed to create personal access token\");\n }\n\n printCreatedToken(args.name, result.accessToken, args.write, \"created\");\n },\n});\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { fetchLatestToken, readPlatformConfig } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport ml from \"@/utils/multiline\";\n\nexport const deleteCommand = defineAppCommand({\n name: \"delete\",\n description: \"Delete a personal access token.\",\n args: z\n .object({\n name: arg(z.string(), {\n positional: true,\n description: \"Token name\",\n }),\n })\n .strict(),\n run: async (args) => {\n await assertWritable();\n const config = await readPlatformConfig();\n\n if (!config.current_user) {\n throw new Error(ml`\n No user logged in.\n Please login first using 'tailor-sdk login' command.\n `);\n }\n\n const token = await fetchLatestToken(config, config.current_user);\n const client = await initOperatorClient(token);\n\n await client.deletePersonalAccessToken({\n name: args.name,\n });\n\n logger.success(`Personal access token \"${args.name}\" deleted successfully.`);\n },\n});\n","import { z } from \"zod\";\nimport { paginationArgs, toPageDirection } from \"@/cli/shared/args\";\nimport { fetchPaged, initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { fetchLatestToken, readPlatformConfig } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport ml from \"@/utils/multiline\";\nimport { transformPersonalAccessToken, type PersonalAccessTokenInfo } from \"./transform\";\n\nexport const listCommand = defineAppCommand({\n name: \"list\",\n description: \"List all personal access tokens.\",\n args: z.object({ ...paginationArgs() }).strict(),\n run: async (args) => {\n const jsonOutput = logger.jsonMode;\n const config = await readPlatformConfig();\n\n if (!config.current_user) {\n throw new Error(ml`\n No user logged in.\n Please login first using 'tailor-sdk login' command.\n `);\n }\n\n const token = await fetchLatestToken(config, config.current_user);\n const client = await initOperatorClient(token);\n\n const pageDirection = toPageDirection(args.order);\n const pats = await fetchPaged(\n async (pageToken, pageSize) => {\n const { personalAccessTokens, nextPageToken } = await client.listPersonalAccessTokens({\n pageToken,\n pageSize,\n pageDirection,\n });\n return [personalAccessTokens, nextPageToken];\n },\n { limit: args.limit },\n );\n\n if (pats.length === 0) {\n logger.info(ml`\n No personal access tokens found.\n Please create a token using 'tailor-sdk user pat create' command.\n `);\n if (!jsonOutput) {\n return;\n }\n }\n\n const patInfos: PersonalAccessTokenInfo[] = pats.map(transformPersonalAccessToken);\n if (jsonOutput) {\n logger.out(patInfos);\n return;\n }\n\n // Text format: aligned list \"name: scope1/scope2\"\n const maxNameLength = Math.max(...pats.map((pat) => pat.name.length));\n\n pats.forEach((pat) => {\n const info = transformPersonalAccessToken(pat);\n const paddedName = info.name.padStart(maxNameLength);\n logger.log(`${paddedName}: ${info.scopes.join(\"/\")}`);\n });\n },\n});\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { initOperatorClient } from \"@/cli/shared/client\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { fetchLatestToken, readPlatformConfig } from \"@/cli/shared/context\";\nimport { assertWritable } from \"@/cli/shared/readonly-guard\";\nimport ml from \"@/utils/multiline\";\nimport { getScopesFromWriteFlag, printCreatedToken } from \"./transform\";\n\nexport const updateCommand = defineAppCommand({\n name: \"update\",\n description: \"Update a personal access token (delete and recreate).\",\n args: z\n .object({\n name: arg(z.string(), {\n positional: true,\n description: \"Token name\",\n }),\n write: arg(z.boolean().default(false), {\n alias: \"W\",\n description: \"Grant write permission (if not specified, keeps read-only)\",\n }),\n })\n .strict(),\n run: async (args) => {\n await assertWritable();\n const config = await readPlatformConfig();\n\n if (!config.current_user) {\n throw new Error(ml`\n No user logged in.\n Please login first using 'tailor-sdk login' command.\n `);\n }\n\n const token = await fetchLatestToken(config, config.current_user);\n const client = await initOperatorClient(token);\n\n // Delete the existing token\n await client.deletePersonalAccessToken({\n name: args.name,\n });\n\n // Create a new token with the same name\n const scopes = getScopesFromWriteFlag(args.write);\n const result = await client.createPersonalAccessToken({\n name: args.name,\n scopes,\n });\n\n if (!result.accessToken) {\n throw new Error(\"Failed to create personal access token\");\n }\n\n printCreatedToken(args.name, result.accessToken, args.write, \"updated\");\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { createCommand } from \"./create\";\nimport { deleteCommand } from \"./delete\";\nimport { listCommand } from \"./list\";\nimport { updateCommand } from \"./update\";\n\nexport const patCommand = defineCommand({\n name: \"pat\",\n description: \"Manage personal access tokens.\",\n subCommands: {\n list: listCommand,\n create: createCommand,\n delete: deleteCommand,\n update: updateCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { arg } from \"politty\";\nimport { z } from \"zod\";\nimport { defineAppCommand } from \"@/cli/shared/command\";\nimport { readPlatformConfig, writePlatformConfig } from \"@/cli/shared/context\";\nimport { logger } from \"@/cli/shared/logger\";\nimport ml from \"@/utils/multiline\";\n\nexport const switchCommand = defineAppCommand({\n name: \"switch\",\n description: \"Set current user.\",\n args: z\n .object({\n user: arg(z.string(), {\n positional: true,\n description: \"User email\",\n }),\n })\n .strict(),\n run: async (args) => {\n const config = await readPlatformConfig();\n\n // Check if user exists\n if (!config.users[args.user]) {\n throw new Error(ml`\n User \"${args.user}\" not found.\n Please login first using 'tailor-sdk login' command to register this user.\n `);\n }\n\n // Set current user\n config.current_user = args.user;\n writePlatformConfig(config);\n\n logger.success(`Current user set to \"${args.user}\" successfully.`);\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { currentCommand } from \"./current\";\nimport { listCommand } from \"./list\";\nimport { patCommand } from \"./pat\";\nimport { switchCommand } from \"./switch\";\n\nexport const userCommand = defineCommand({\n name: \"user\",\n description: \"Manage Tailor Platform users.\",\n subCommands: {\n current: currentCommand,\n list: listCommand,\n switch: switchCommand,\n pat: patCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { executionsCommand } from \"./executions\";\nimport { getCommand } from \"./get\";\nimport { listCommand } from \"./list\";\nimport { resumeCommand } from \"./resume\";\nimport { startCommand } from \"./start\";\n\nexport const workflowCommand = defineCommand({\n name: \"workflow\",\n description: \"Manage workflows and workflow executions.\",\n subCommands: {\n list: listCommand,\n get: getCommand,\n start: startCommand,\n executions: executionsCommand,\n resume: resumeCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { healthCommand } from \"./health\";\nimport { listCommand } from \"./list\";\n\nexport const appCommand = defineCommand({\n name: \"app\",\n description: \"Manage workspace applications\",\n subCommands: {\n health: healthCommand,\n list: listCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { inviteCommand } from \"./invite\";\nimport { listCommand } from \"./list\";\nimport { removeCommand } from \"./remove\";\nimport { updateCommand } from \"./update\";\n\nexport const userCommand = defineCommand({\n name: \"user\",\n description: \"Manage workspace users\",\n subCommands: {\n invite: inviteCommand,\n list: listCommand,\n remove: removeCommand,\n update: updateCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","import { defineCommand, runCommand } from \"politty\";\nimport { appCommand } from \"./app\";\nimport { createCommand } from \"./create\";\nimport { deleteCommand } from \"./delete\";\nimport { getCommand } from \"./get\";\nimport { listCommand } from \"./list\";\nimport { restoreCommand } from \"./restore\";\nimport { userCommand } from \"./user\";\n\nexport const workspaceCommand = defineCommand({\n name: \"workspace\",\n description: \"Manage Tailor Platform workspaces.\",\n subCommands: {\n app: appCommand,\n create: createCommand,\n delete: deleteCommand,\n get: getCommand,\n list: listCommand,\n restore: restoreCommand,\n user: userCommand,\n },\n async run() {\n await runCommand(listCommand, []);\n },\n});\n","#!/usr/bin/env node\n\nimport { defineCommand, runMain } from \"politty\";\nimport { withCompletionCommand } from \"politty/completion\";\nimport { z } from \"zod\";\nimport { apiCommand } from \"./commands/api\";\nimport { authconnectionCommand } from \"./commands/authconnection\";\nimport { crashReportCommand } from \"./commands/crashreport\";\nimport { deployCommand } from \"./commands/deploy\";\nimport { executorCommand } from \"./commands/executor\";\nimport { functionCommand } from \"./commands/function\";\nimport { generateCommand } from \"./commands/generate\";\nimport { initCommand } from \"./commands/init\";\nimport { loginCommand } from \"./commands/login\";\nimport { logoutCommand } from \"./commands/logout\";\nimport { machineuserCommand } from \"./commands/machineuser\";\nimport { oauth2clientCommand } from \"./commands/oauth2client\";\nimport { openCommand } from \"./commands/open\";\nimport { organizationCommand } from \"./commands/organization\";\nimport { profileCommand } from \"./commands/profile\";\nimport { removeCommand } from \"./commands/remove\";\nimport { secretCommand } from \"./commands/secret\";\nimport { setupCommand } from \"./commands/setup\";\nimport { showCommand } from \"./commands/show\";\nimport { skillsCommand } from \"./commands/skills\";\nimport { staticwebsiteCommand } from \"./commands/staticwebsite\";\nimport { tailordbCommand } from \"./commands/tailordb\";\nimport { upgradeCommand } from \"./commands/upgrade\";\nimport { userCommand } from \"./commands/user\";\nimport { workflowCommand } from \"./commands/workflow\";\nimport { workspaceCommand } from \"./commands/workspace\";\nimport { initCrashReporting } from \"./crashreport\";\nimport { queryCommand } from \"./query\";\nimport { commonArgs, isVerbose } from \"./shared/args\";\nimport { isCLIError } from \"./shared/errors\";\nimport { logger } from \"./shared/logger\";\nimport { readPackageJson } from \"./shared/package-json\";\nimport { isNativeTypeScriptRuntime } from \"./shared/runtime\";\n\n// Register tsx for TypeScript loading on Node.js.\n// Bun and Deno handle TypeScript natively, so registration is skipped.\n// tsx's own register() picks `module.registerHooks` on Node ≥ 24.11.1 / 25.1 / 26\n// (avoiding the DEP0205 deprecation) and falls back to `module.register` on older runtimes.\nif (!isNativeTypeScriptRuntime()) {\n const { register } = await import(\"tsx/esm/api\");\n register();\n}\n\n// Runs before globalArgs effects load --env-file, so env file overrides for\n// TAILOR_CRASH_REPORTS_* are not available for early startup failures.\n// This is intentional: we want crash reporting active before argument parsing,\n// and env files require parsing to be complete. Shell-level env vars still work.\ninitCrashReporting();\n\nconst packageJson = await readPackageJson();\nconst cliName = Object.keys(packageJson.bin ?? {})[0] || \"tailor-sdk\";\n\nexport const mainCommand = withCompletionCommand(\n defineCommand({\n name: cliName,\n description:\n packageJson.description || \"Tailor CLI for managing Tailor Platform SDK applications\",\n subCommands: {\n api: apiCommand,\n authconnection: authconnectionCommand,\n crashreport: crashReportCommand,\n deploy: deployCommand,\n executor: executorCommand,\n function: functionCommand,\n generate: generateCommand,\n init: initCommand,\n login: loginCommand,\n logout: logoutCommand,\n machineuser: machineuserCommand,\n oauth2client: oauth2clientCommand,\n open: openCommand,\n organization: organizationCommand,\n profile: profileCommand,\n query: queryCommand,\n remove: removeCommand,\n secret: secretCommand,\n setup: setupCommand,\n show: showCommand,\n skills: skillsCommand,\n staticwebsite: staticwebsiteCommand,\n tailordb: tailordbCommand,\n upgrade: upgradeCommand,\n user: userCommand,\n workflow: workflowCommand,\n workspace: workspaceCommand,\n },\n }),\n);\n\nrunMain(mainCommand, {\n version: packageJson.version,\n globalArgs: z.object(commonArgs),\n displayErrors: false,\n cleanup: async ({ error }) => {\n if (error) {\n if (isCLIError(error)) {\n logger.log(error.format());\n if (isVerbose() && error.stack) {\n logger.debug(`\\nStack trace:\\n${error.stack}`);\n }\n } else if (error instanceof Error) {\n logger.error(error.message);\n if (isVerbose() && error.stack) {\n logger.debug(`\\nStack trace:\\n${error.stack}`);\n }\n } else {\n logger.error(`Unknown error: ${error}`);\n }\n\n // Report programming bugs (native error types that indicate code defects).\n // Skip domain errors like ConnectError, CIPromptError, and plain Error\n // used for user-facing validation/not-found messages.\n // Exclude SyntaxError/ReferenceError: at runtime these typically come from\n // dynamically imported user config files, not from SDK code.\n const shouldReport =\n !isCLIError(error) &&\n (!(error instanceof Error) || error instanceof TypeError || error instanceof RangeError);\n if (shouldReport) {\n // Lazy import to match shutdownTelemetry pattern and keep cleanup handler lightweight.\n const { reportCrash } = await import(\"@/cli/crashreport\");\n await reportCrash(error, \"handledError\");\n }\n }\n const { shutdownTelemetry } = await import(\"@/cli/telemetry\");\n await shutdownTelemetry();\n },\n});\n"],"mappings":"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"}